SQL 多列左外连接
SQL left outer join on multiple columns
根据此 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
这是因为在成功连接后,所有三列都将具有非空值。
如果其中一些列可以为 null,并且您想在连接后检查它们中的任何一个是否有值,那么您的第一个 (OR
) 方法就可以了。
您可以使用任意组合的加入条件:
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
将 return 来自 a
且在 b
中没有匹配记录的所有记录,或者当 b.foo
为 null
时。
根据此 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
这是因为在成功连接后,所有三列都将具有非空值。
如果其中一些列可以为 null,并且您想在连接后检查它们中的任何一个是否有值,那么您的第一个 (OR
) 方法就可以了。
您可以使用任意组合的加入条件:
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
将 return 来自 a
且在 b
中没有匹配记录的所有记录,或者当 b.foo
为 null
时。