SQL在多列上保留外连接

Fra*_* M. 8 sql join vertica

根据此SQL连接备忘单,一列上的左外连接如下:

SELECT *
  FROM a
  LEFT JOIN b 
    ON a.foo = b.foo
  WHERE b.foo IS NULL 
Run Code Online (Sandbox Code Playgroud)

我想知道在多个列上连接会是什么样子,如果它是一个ORANDWHERE子句中?

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
Run Code Online (Sandbox Code Playgroud)

要么

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
Run Code Online (Sandbox Code Playgroud)

(我不认为它,但如果重要,db引擎是Vertica的)

(我打赌那个OR)

Cri*_*scu 16

这取决于列是否可以为空,但假设它们不是,检查它们中的任何一个将执行:

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
Run Code Online (Sandbox Code Playgroud)

这是因为在成功连接之后,所有三列都将具有非空值.

如果这些列中的某些列可以为空并且您想要检查它们中的任何一个是否在连接后具有值,那么您的第一个(OR)方法就可以了.