Oracle Code将数据插入到不存在的表中

时间:2013-09-18 15:31:34

标签: sql oracle

我正在尝试将数据插入Oracle数据库中的表中。数据已经存在,但不是所有数据,我不能只删除数据并重新插入数据。有没有办法将数据插入表中(不知道我缺少什么数据)。我的脚本正在运行,但实际上没有插入任何数据(我确实知道数据丢失了。我故意将数据用于测试其重新插入。)

Insert into item (item, descr) 
select distinct a.SUBORD, a.SUBORD_DESCR FROM EXIDE.UDT_BOM a, item b 
where b.item = a.subord and not exists 
(select b.item from item b, exide.udt_bom a where a.subord = b.ITEM)

2 个答案:

答案 0 :(得分:2)

如果我按照您正在进行的操作,您可以使用merge statement

merge into item i
using (select subord, subord_descr from exide.udt_bom) u
on (i.item = u.subord)
when not matched then insert (item, descr) values (u.subord, u.subord_descr);

SQL fiddle demo

这样做的另一个好处是,如果udt_bom有现有项目的新描述,您也可以更新item表中的内容:

merge into item i
using (select subord, subord_descr from exide.udt_bom) u
on (i.item = u.subord)
when matched then update set descr = u.subord_descr
when not matched then insert (item, descr) values (u.subord, u.subord_descr);

Another fiddle

答案 1 :(得分:1)

您对太多表的引用太多了。使用not exists子句,查询不需要显式连接:

Insert into item(item, descr) 
    select distinct b.SUBORD, b.SUBORD_DESCR
    FROM EXIDE.UDT_BOM b
    where not exists (select i.item from item i where b.subord = i.ITEM);

如果没有重复项,在udt_bom中,我也会删除distinct。并且,当您使用表缩写作为别名时,查询更具可读性,而不是像ab等无意义的字母。