发布网友 发布时间:2022-04-08 00:27
共4个回答
懂视网 时间:2022-04-08 04:48
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中用一张表的字段更新另一张表的字段
标签:
热心网友 时间:2022-04-08 01:56
如果下面的子查询返回多条数据,是会报错的。
SELECT DD, EE, FF
FROM TEST_TABLE2 T2
WHERE 1=1
第 1 行出现错误:
ORA-01427: 单行子查询返回多个行
如果test_table2 表中只有一条数据,那么是没有问题的。
我觉得你这两个表一定是要有关联关系的,不然这个update语句没什么意义。
比如test_table1 表中有一个id字段,一对一关联着test_table2 表中的id字段,那么可以这样写:
追问对的,肯定是有关联,而且还在就报你说的错误了,最后我用了exists才弄好了,,,
热心网友 时间:2022-04-08 03:14
你如果要是插入记录的话可以这么写热心网友 时间:2022-04-08 04:49
如果test_table1和test_table2是关联的才能叫更新,采用renfengjun1986的方法即可,