当前位置:Gxlcms > 数据库问题 > Oracle中用一张表的字段更新另一张表的字段

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

时间:2021-07-01 10:21:17 帮助过:5人阅读

D USING B ON (D.CATEGORY_NAME = B.CATEGORY_NAME /*AND B IS NULL*/) WHEN MATCHED THEN UPDATE SET RELAVANCE_PROPETY = B.RELAVANCE_PROPETY

关于MERGE INTO的详细讲解

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

错误1:技术分享

技术分享

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

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

原因:

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

D.CATEGORY_NAME = B.CATEGORY_NAME

可以看出。

补充:

  技术分享

解决:

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

用下面的SQL获得哪些CATEGORY_NAME的值重复了:

SELECT CATEGORY_NAME,COUNT(1) FROM B
GROUP BY CATEGORY_NAME
HAVING COUNT(1) >1

效果如下:

技术分享

接下来是删除重复的数据,执行下面语句进入编辑模式:

SELECT * 
FROM B MM
WHERE MM.CATEGORY_NAME IN
(SELECT CATEGORY_NAME FROM B
GROUP BY CATEGORY_NAME
HAVING COUNT(1) >1) 
FOR UPDATE

效果如下:

技术分享

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

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

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

 

错误2:

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

select * into new_table from old_table

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

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

技术分享

为什么呢?

原因:

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

所以,会报ORA-00905错误。

解决:

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

那就是用create table,语句如下:

--复制表结构和数据
CREATE TABLE B1 AS SELECT * FROM B;

AS后接一个查询语句。

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

标签:

人气教程排行