web-dev-qa-db-ja.com

複数の列でのSQL左外部結合

この SQL join cheat-sheet によると、1つの列の左外部結合は次のとおりです。

SELECT *
  FROM a
  LEFT JOIN b 
    ON a.foo = b.foo
  WHERE b.foo IS NULL 

複数の列で結合するとどのように見えるのか、それがOR句のANDWHEREのどちらでしょうか?

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に賭けています)

7
François M.

これは、列が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)アプローチは問題ありません。

15

参加の基準の任意の組み合わせを使用できます。

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.foonullでした。