SQL在多列上保留外连接

时间:2016-10-13 08:20:25

标签: sql join vertica

根据此SQL join cheat-sheet,一列上的左外连接如下:

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一个)

2 个答案:

答案 0 :(得分:13)

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

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

这是因为在成功加入后,所有三列都将具有非空值。

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

答案 1 :(得分:1)

您可以使用任何标准组合进行加入:

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将返回abb.foonull时没有匹配记录的所有记录。