web-dev-qa-db-ja.com

2番目のテーブルの複数の列値に基づいて1つのテーブルのレコードを削除する

表2の複数の列のデータに基づいて、表1のレコードを挿入および削除する必要があります。

例:Table1とTable2には同じ列があります:住所、都市、州、郵便番号。

Table1は、数百万のレコードを持つマスターテーブルです。 Table2(数千のレコード)は、何らかの方法で変更されたデータに基づくテーブルです。ただし、このテーブルのデータは変更されない場合があります。

一致するレコードは、住所、都市、州、郵便番号の値が両方のテーブルで同じであることを意味します。

だから私は2つの操作をしたいです:

  • Table2にのみ存在するレコードをTable1に挿入します
  • レコードがTable2になく、市がTable2にあるTable1からレコードを削除します

Table1のサイズに基づいて、これを実行する非常に効率的な方法が必要です。私はいくつかのSQLを知っていますが、SQLを使用してこれを行う場合に必要となるレベルまでは知りません。

これはDB2データベース-バージョン10.5です。

3
Tom
  • 操作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にはなく、cityTable2にあります。

    (列がnull可能ではないと仮定します。それらがnullを許可する場合は、NOT INNOT 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制約に適しているように見えるため、そのようなインデックスがすでにある可能性があります。

4
ypercubeᵀᴹ