プログラミング言語や環境設定を中心としたパソコン関連の技術メモです。
主にシステム開発中に調べたことをメモしています。TIPS的な位置付けで、気が向いたときにちまちま更新していきます。
SQLServer、テーブル同士を比較してレコードが存在しなかったらInsertする
結論から書くと、こんなSQL文でOKでしたφ(--)

INSERT INTO targetTable (key, column1) 
SELECT tbl1.key, tbl1.column1  FROM baseTable tbl1
WHERE NOT EXISTS(
    SELECT 'a' 
    FROM   targetTable tbl2
    WHERE  tbl2.key = tbl1.key
)

それでは詳細……と言うほどでもないですが詳細を書いていきます。

2つのテーブルを比較して、テーブルAにはあるけどテーブルBにはないレコードを
テーブルBにInsertしたかったのです。

頑張ればSQL文一発でいけるよね(--?というのが今回のきっかけです。

教えて!Googleせんせー!

ふむふむ(--)

こんなSQL文でいけましたφ(--)

INSERT INTO targetTable (key, column1) 
SELECT tbl1.key, tbl1.column1  FROM baseTable tbl1
WHERE NOT EXISTS(
    SELECT 'a' 
    FROM   targetTable tbl2
    WHERE  tbl2.key = tbl1.key
)

まず

SELECT 'a'
FROM targetTable tbl2
WHERE tbl2.key = tbl1.key

の部分は「baseTable(tbl1)とtargetTable(tbl2)にあるデータ」の条件指定です。
この条件に一致するデータが

WHERE NOT EXISTS(~)

なのです。
よって

SELECT tbl1.key, tbl1.column1  FROM baseTable tbl1
WHERE NOT EXISTS(
    SELECT 'a' 
    FROM   targetTable tbl2
    WHERE  tbl2.key = tbl1.key
)



1.「baseTable(tbl1)とtargetTable(tbl2)にあるデータ」以外のデータを
2.baseTable(tbl1)から抽出する


言い換えると

1.baseTable(tbl1)にあるけどtargetTable(tbl2)にないデータを
2.baseTable(tbl1)から抽出する


指定になります。

これで、baseTable(tbl1)にあるけどtargetTable(tbl2)にないデータが抽出できました。

あとは、この抽出結果をtargetTable(tbl2)に突っ込めば完了です。
ということで

INSERT INTO targetTable (key, column1) 
SELECT tbl1.key, tbl1.column1  FROM baseTable tbl1
WHERE NOT EXISTS(
    SELECT 'a' 
    FROM   targetTable tbl2
    WHERE  tbl2.key = tbl1.key
)

を実行すれば、baseTable(tbl1)にあるけどtargetTable(tbl2)にないデータが
targetTable(tbl2)に突っ込まれます。

そんな感じ\(--)/
スポンサーリンク
 
このエントリーをはてなブックマークに追加 

category:● SQLServer  thema:システム開発 - genre:コンピュータ  Posted by ササキマコト 

  関連記事