表2の複数の列のデータに基づいて、表1のレコードを挿入および削除する必要があります。
例:Table1とTable2には同じ列があります:住所、都市、州、郵便番号。
Table1は、数百万のレコードを持つマスターテーブルです。 Table2(数千のレコード)は、何らかの方法で変更されたデータに基づくテーブルです。ただし、このテーブルのデータは変更されない場合があります。
一致するレコードは、住所、都市、州、郵便番号の値が両方のテーブルで同じであることを意味します。
だから私は2つの操作をしたいです:
Table1のサイズに基づいて、これを実行する非常に効率的な方法が必要です。私はいくつかのSQLを知っていますが、SQLを使用してこれを行う場合に必要となるレベルまでは知りません。
これはDB2データベース-バージョン10.5です。
操作1
Table1
にのみ存在するレコードをTable2
に挿入します。
INSERT INTO Table1
(address, city, state, Zip)
SELECT address, city, state, Zip FROM Table2
EXCEPT
SELECT address, city, state, Zip FROM Table1 ;
操作2
レコードをTable1
から削除します。ここで、レコードはTable2
にはなく、city
はTable2
にあります。
(列がnull可能ではないと仮定します。それらがnullを許可する場合は、NOT IN
をNOT EXISTS
サブクエリで書き換えることをお勧めします):
DELETE FROM Table1
WHERE (address, city, state, Zip)
NOT IN
(SELECT address, city, state, Zip FROM Table2)
AND city IN
(SELECT city FROM Table2) ;
パフォーマンスと効率性については、私はDB2の経験がほとんどないので、他の回答を待つのが良いでしょう。ただし、すべての列のインデックス(address, city, state, Zip)
-両方のテーブルのインデックス-は、クエリに対して実行できる最善の方法であり、さらに(city)
の単一のインデックスが最適です。または、2つの提案を1つのインデックスで4つの列すべてと組み合わせることもできますが、インデックスの最初の部分にcity
を選択します:(city, address, state, Zip)
。
テーブルの構造は提供していませんが、4列はUNIQUE
制約に適しているように見えるため、そのようなインデックスがすでにある可能性があります。