この SQL join cheat-sheet によると、1つの列の左外部結合は次のとおりです。
SELECT *
FROM a
LEFT JOIN b
ON a.foo = b.foo
WHERE b.foo IS NULL
複数の列で結合するとどのように見えるのか、それがOR
句のAND
かWHERE
のどちらでしょうか?
SELECT *
FROM a
LEFT JOIN b
ON a.foo = b.foo
AND a.bar = b.bar
AND a.ter = b.ter
WHERE b.foo IS NULL
OR b.bar IS NULL
OR b.ter IS NULL
または
SELECT *
FROM a
LEFT JOIN b
ON a.foo = b.foo
AND a.bar = b.bar
AND a.ter = b.ter
WHERE b.foo IS NULL
AND b.bar IS NULL
AND b.ter IS NULL
?
(私はそうは思わないが、それが重要な場合、dbエンジンはVerticaのものだ)
(OR
に賭けています)
これは、列がNULL可能かどうかによって異なりますが、そうでないと仮定すると、列のいずれかをチェックすると実行されます。
SELECT *
FROM a
LEFT JOIN b
ON a.foo = b.foo
AND a.bar = b.bar
AND a.ter = b.ter
WHERE b.foo IS NULL -- this could also be bar or ter
これは、結合が成功した後、3つの列すべてが非ヌル値を持つためです。
これらの列の一部がNULL入力可能で、結合後に値のいずれかがあるかどうかを確認したい場合、最初の(OR
)アプローチは問題ありません。
参加の基準の任意の組み合わせを使用できます。
SELECT *
FROM a
LEFT JOIN b ON a.foo = b.foo AND a.bar = b.bar AND a.ter = b.ter
WHERE
句は、結合自体とは関係ありません。 WHERE b.foo IS NULL
最初のクエリでは、a
に一致するレコードがなかったb
から、またはb.foo
はnull
でした。