web-dev-qa-db-de.com

SQL-Outer-Join für mehrere Spalten

Gemäß diesem SQL-Join-Spickzettel ist ein linker äußerer Join in einer Spalte der folgende: 

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

Ich frage mich, wie es mit einem Join in mehreren Spalten aussehen würde. Sollte es eine OR oder eine AND in der WHERE-Klausel sein?

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

oder 

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

?

(Ich denke nicht, dass es das tut, aber falls es wichtig ist, ist die DB-Engine Vertica's)

(Ich wette auf die Variable OR)

5
François M.

Das hängt davon ab, ob die Spalten nullfähig sind, aber vorausgesetzt, dies ist nicht der Fall.

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

Dies liegt daran, dass nach einem erfolgreichen Join alle drei Spalten einen Wert ungleich Null haben.

Wenn einige dieser Spalten mit Nullwerten versehen werden können und Sie prüfen möchten, ob eine der Spalten nach dem Join einen Wert hatte, wäre Ihre erste (OR) Methode in Ordnung.

12

Sie können eine beliebige Kombination von Kriterien für den Beitritt verwenden:

SELECT *
FROM a
LEFT JOIN b ON a.foo = b.foo AND a.bar = b.bar AND a.ter = b.ter

Die WHERE-Klausel hat nichts mit dem Join selbst zu tun ..__ Die WHERE b.foo IS NULL in der ersten Abfrage gibt alle Datensätze aus a zurück, die keine passenden Datensätze in b hatten oder wenn b.foonull war.