私の場合、同じ構造の2つのテーブルがあります:TableA
& TableB
そして、私はレコードがAのみB Aに存在するがない2つのレコードがありますが。削除された行を見つける:存在していないvsはありません
私のスクリプトは
SELECT * FROM TableA
WHERE NOT EXISTS (
SELECT * FROM TableB
)
た、このスクリプトは何も返しません。次に、次のように変更しました:
SELECT ID FROM TableA
WHERE ID NOT IN (
SELECT ID FROM TableB
)
このスクリプトは正常に動作し、2レコードのIDを返します。
質問:この動作は正常ですか? NOT EXISTS
とNOT IN
のメカニズムは何ですか?
私はNOT EXISTS
とNOT IN
を比較するいくつかの他の記事を読んでいると、ほとんどの人は99.9%のシナリオでNOT EXISTS
を使用することをお勧めし、この場合はNOT EXISTS
が適用されないことを0.1%に落ちていますか? あなたは、行のすべての値を見たい場合は、
最初のクエリは、WHERE TableB.id = TableA.id 'のように、条件が欠けています'(ネストされたクエリの内部)。したがって、クエリは文字通り次のように読み込まれます。TableAから同じIDを持つTableBの行が存在しない場所をすべて選択します。 – zerkms
"この場合は、存在しないNOT 0.1%に該当します" ---私は 'IN 'を含むすべての**クエリは' EXISTS'で表現できると言っています。 – zerkms