仕事でSQLで2つのテーブル間で差分のみを抽出してINSERTする必要があったので対応したメモを残しておきます。
対象者
- 2つのテーブル間で差分をのみ取り込みたい人
差分にみINSERTするSQL
EXISTSを使うことで実現できます。
SQLのサンプル
実際のSQLは以下のようになります。
INSERT INTO TBL_A
SELECT *
FROM
TBL_B B
WHERE NOT EXISTS(
SELECT 'X'
FROM TBL_A A
WHERE
A.{key} = B.{key}
)
解説
IDがKeyとなる二つのテーブルがあり3行目だけ異なるデータが存在しているとします。
- TBL_A
ID | NAME | PRICE |
---|---|---|
1 | トマト | 100 |
2 | にんじん | 150 |
3 | たまねぎ | 200 |
- TBL_B
ID | NAME | PRICE |
---|---|---|
1 | トマト | 100 |
2 | にんじん | 150 |
4 | なす | 250 |
NOT EXISTSでTBL_BからTBL_AのIDとが一致しない行を取得します。
SELECT *
FROM
TBL_B B
WHERE NOT EXISTS(
SELECT 'X'
FROM TBL_A A
WHERE
A.{key} = B.{key}
)
今回の例ではTBL_Bに存在してTBL_Aに存在しないIDは4なので以下の行が取得できます。
ID | NAME | PRICE |
---|---|---|
4 | なす | 250 |
取得した行をTBL_AにINSERTするので、 TBL_A に存在しない行がTBL_AにINSERTされるので結果として以下のようになります。
INSERT INTO TBL_A
SELECT *
FROM
TBL_B B
WHERE NOT EXISTS(
SELECT 'X'
FROM TBL_A A
WHERE
A.{key} = B.{key}
)
- TBL_A
ID | NAME | PRICE |
---|---|---|
1 | トマト | 100 |
2 | にんじん | 150 |
3 | たまねぎ | 200 |
4 | なす | 250 |