多列上的 SQL 左外连接

标签 sql join vertica

根据这个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)

最佳答案

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

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

关于多列上的 SQL 左外连接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40015779/

相关文章:

mysql - 同一个表的多个连接计数错误

sql - SQL 中的序列编号

java - 尝试在 java 中创建 vertica udx 时出错

php - SQL 连接 : Join two tables to get the result from second tables to grep result and

sql - Postgresql——其他条件相同,查询(小)整数或浮点值是否比查询(小)字符串值更快?

mysql - 在 MySQL 中递归地获取经理下的员工数

php - 如何加入多个查询

python - 如何在 Python 中使用 mrjob 将 Reduce Side Join 作为 Map Reduce 作业进行

mysql - SQL - 替换 HAVING COUNT(*) == 0

hadoop - Sqoop 导出作业的 sqoop.export.records.per.statement 有限制吗?