oracle根据另一张表更新数据库,[数据库]Oracle中用一张表的字段更新另一张表的字段_星空网...

Oracle中用一张表的字段更新另一张表的字段

2015-07-01

0

今天在做项目的过程中,发现开发库中某张表的某字段有许多值是空的,而测试库中该字段的值则是有的。

那么,有什么办法能将测试库中该字段的值更新到开发库中呢?

SQL Server中这是比较容易解决的,而Oracle中就不知道方法了。

SQL Server中类似问题的解决方法

后来只好用最笨的方法:

首先,将数据复制到Excel;(假设称测试库的表为A--含有数据)

然后,在开发库中建立和表A同结构的表B;(这里为了导入数据的简单,我对表B的结构进行了改造,只有两个字段)

bc91bb04e6e9c61e24c974e4440db8f2.gif

图 表B的数据

再利用PL SQL的导入功能将这些数据导入到表B中(此时表B的数据为表A的子集);

接下来要做的是将表B的数据更新到开发库中相应的表中,假设称之为表D;

这里用到了oracle中的Merge into。

SQL Code如下:MERGE INTO DUSING BON (D.CATEGORY_NAME = B.CATEGORY_NAME /*AND B IS NULL*/)WHEN MATCHED THEN UPDATE SET RELAVANCE_PROPETY = B.RELAVANCE_PROPETY

关于MERGE INTO的详细讲解

但是,在此过程中发生了错误:

错误1:

bc91bb04e6e9c61e24c974e4440db8f2.gif

bc91bb04e6e9c61e24c974e4440db8f2.gif

在执行MERGE INTO操作的时候,发生了ORA-30926错误。

该错误的原因是什么?如何解决呢?

原因:

百度了一下,大体知道是因为表B含有重复的Key,这里的Key就是条件中的CATEGORY_NAME,从条件:D.CATEGORY_NAME = B.CATEGORY_NAME

可以看出。

补充:

bc91bb04e6e9c61e24c974e4440db8f2.gif

解决:

知道了上面的原因,我们要做的就是把有重复CATEGORY_NAME的记录删除。

用下面的SQL获得哪些CATEGORY_NAME的值重复了:SELECT CATEGORY_NAME,COUNT(1) FROM BGROUP BY CATEGORY_NAMEHAVING COUNT(1) >1

效果如下:

bc91bb04e6e9c61e24c974e4440db8f2.gif

接下来是删除重复的数据,执行下面语句进入编辑模式:SELECT * FROM B MMWHERE MM.CATEGORY_NAME IN(SELECT CATEGORY_NAME FROM BGROUP BY CATEGORY_NAMEHAVING COUNT(1) >1) FOR UPDATE

效果如下:

bc91bb04e6e9c61e24c974e4440db8f2.gif

然后选择需要删除的数据。

我们这边的表只有2个字段,所以可以用group by结果转存到临时表,再用临时表覆盖原表的方法洗数据。

但更多的情况是:(1)字段多于两个;(2)且某个字段相同的记录,别的字段可能不同(即不完全相同)

错误2:

在给B表做备份时,想整表复制到新表中,原来经常使用:

select * into new_table from old_table

去做这样的事情。预期的结果是:在复制表结构的同时,将表中的数据同时复制到new_table中。

结果,出现了下面的错误:

bc91bb04e6e9c61e24c974e4440db8f2.gif

为什么呢?

原因:

原来select into是PL/SQL的赋值语句!而这里的使用格式和赋值的格式是不一致的。

所以,会报ORA-00905错误。

解决:

那么,PL/SQL中如何解决类似问题的呢?

那就是用create table,语句如下:--复制表结构和数据CREATE TABLE B1 AS SELECT * FROM B;

AS后接一个查询语句。

转载请保留本文网址: http://www.shaoqun.com/m/a/122613.html

*特别声明:以上内容来自于网络收集,著作权属原作者所有,如有侵权,请联系我们:admin@shaoqun.com。

0

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值