使用多列进行 SQL 左外连接

17
根据这份SQL join cheat-sheet显示,一个基于一列的左外连接是如下所示的:
SELECT *
  FROM a
  LEFT JOIN b 
    ON a.foo = b.foo
  WHERE b.foo IS NULL 

我在想,如果在多列上进行连接,WHERE子句中应该使用OR还是AND

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

(我不认为这很重要,但以防万一,数据库引擎是Vertica)

(我打赌是OR

3个回答

33

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

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)方法是可以的。

2

您可以使用任何组合的条件进行连接:

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将返回所有在b中没有匹配记录或者b.foonull时来自a的记录。


0
如果你想不使用LEFT JOIN关键字,而是使用(+)符号,你可以这样做:
SELECT *
    FROM a, b 
    WHERE a.foo = b.foo (+)
    AND a.bar = b.bar (+)
    AND a.ter = b.ter (+)
    AND b.foo IS NULL

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接