0

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)
4

2 に答える 2

2

私があなたのやっていることに従えば、次のmergeステートメントを使用できます。

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 フィドルのデモ

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);

別のフィドル

于 2013-09-18T16:17:51.430 に答える
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します。aまた、、 などの無意味な文字ではなく、テーブルの省略形をエイリアスとして使用すると、クエリが読みやすくなりますb

于 2013-09-18T16:17:42.887 に答える