テーブル内の行の存在を確認する必要があるときはいつでも、次のような条件を常に書く傾向があります。
SELECT a, b, c
FROM a_table
WHERE EXISTS
(SELECT * -- This is what I normally write
FROM another_table
WHERE another_table.b = a_table.b
)
他の人は次のように書きます:
SELECT a, b, c
FROM a_table
WHERE EXISTS
(SELECT 1 --- This nice '1' is what I have seen other people use
FROM another_table
WHERE another_table.b = a_table.b
)
条件がのNOT EXISTS
代わりにEXISTS
ある場合:場合によってはLEFT JOIN
、追加の条件(antijoinと呼ばれることもある)を使用して記述することがあります。
SELECT a, b, c
FROM a_table
LEFT JOIN another_table ON another_table.b = a_table.b
WHERE another_table.primary_key IS NULL
私はそれを避けるようにします。なぜなら、特にあなたのものprimary_key
がそれほど明白ではない場合、または主キーまたは結合条件が複数列である場合(そして列の1つを簡単に忘れることができる場合)、意味があまり明確ではないと思うからです。ただし、他の誰かが書いたコードを維持することもありますが、それはそこにあります。
SELECT 1
代わりに使用する(スタイル以外の)違いはありますSELECT *
か?
それが同じように動作しないコーナーケースはありますか?私が書いたのは(AFAIK)標準SQLですが、異なるデータベース/古いバージョンでそのような違いはありますか?
明示的に反結合を記述することに利点はありますか?
現代のプランナー/オプティマイザーはNOT EXISTS
条項とは異なる扱いをしますか?
EXISTS (SELECT FROM ...)
。