【環境】
windows2000 server
SQL server 2000
①.SELECT * FROM TBL_A WHERE FLG = 1
②.SELECT * FROM TBL_B WHERE FLG = 2
①の結果と②の結果を用い、共通の3つの項目(主キーではない)を
比較し差分を求めたいのですが、どういったSQL文を組めばよいでしょうか?
NOT EXISTS述語で可能でしょうか?不可能であれば、別の方法でも構いません。
※共通の項目をID,TIME,KINDとします。
とりあえず、not exists でいけそうな感じでした。
アクセスプランを見たところ、TBL_BでID, TIME, KIND, FLG にインデックスがあれば使われるようでした。
select * from TBL_A A where not exists ( select * from TBL_B B where B.ID = A.ID and B.TIME = A.TIME and B.KIND = A.KIND and B.FLG = 2 ) and A.FLG = 1
とりあえず、not exists でいけそうな感じでした。
アクセスプランを見たところ、TBL_BでID, TIME, KIND, FLG にインデックスがあれば使われるようでした。
select * from TBL_A A where not exists ( select * from TBL_B B where B.ID = A.ID and B.TIME = A.TIME and B.KIND = A.KIND and B.FLG = 2 ) and A.FLG = 1
思い通りの結果が得られました。
ありがとうございます。
ふむふむなるほど、こんな組み方をするんですね。
差分検索の例を二つ示します。
<SQL例1>NOT EXISTSを使う
SELECT * FROM TBL_A AS A WHERE NOT EXISTS(SELECT * FROM TBL_B WHERE A.ID=ID AND A."TIME"="TIME" AND A.KIND=KIND)
<SQL例2>LEFT JOINを使う
SELECT A.* FROM TBL_A AS A LEFT JOIN TBL_B AS B ON A.ID=B.ID AND A."TIME"=B."TIME" AND A.KIND=B.KIND WHERE B.ID IS NULL AND B."TIME" IS NULL AND B.KIND IS NULL
ありがとうございます。
<SQL例1>の様にNOT EXISTSを利用したSQL文は組めたのですが、
そのSQL文に①・②のWHERE条件文をどう組み込めばいいのか
わからず、今回の質問をさせて頂きました。
LEFT JOINはACCESSの不一致クエリの考え方と同じみたいですね。
思い通りの結果が得られました。
ありがとうございます。
ふむふむなるほど、こんな組み方をするんですね。