我有一个表A和一个表B.我想加入A到B但只需要连接不可能的结果。我试过了
SELECT B.*
FROM A
RIGHT JOIN B ON A.KEY = B.KEY
WHERE A.KEY IS NULL
这应该有效,但事实并非如此。我的SQL上面是否正确?
答案 0 :(得分:2)
你没有说“你没有工作”是什么意思,但是如果这些问题中的任何一个:
SELECT B.*
FROM A
RIGHT JOIN B ON A.KEY = B.KEY
WHERE A.KEY IS NULL
SELECT A.*
FROM A
LEFT JOIN B ON A.KEY = B.KEY
WHERE B.KEY IS NULL
不返回任何结果,这意味着实体表中的每个键都与外连接表中的至少一个键匹配。
如果您尝试在A或B中找到另一行中没有匹配行的行,则需要查询:
SELECT A.*, B.*, CASE WHEN A.KEY IS NULL THEN 'in B but not A' WHEN B.KEY IS NULL THEN 'in B but not A' END as explanation
FROM A
FULL OUTER JOIN B ON A.KEY = B.KEY
WHERE A.KEY IS NULL OR B.KEY IS NULL
你可能听到有人说“但是,一个密钥永远不能为空,因为这是一个密钥用于/主密钥不能为空!” - 是的,但我们正在加入;它们是表中的主键,但在连接发生后它们不一定是主键。如果B中没有行,其中键等于值,那么数据库将非常乐意为B(包括b.key列)生成满行的NULL值,该行与满载A的实际值的行配对。 of.key - 这意味着表的键不再是连接的键,并且允许为空
你可以针对另一列而不是密钥测试null吗?是的,但除非表中的其他列是NOT NULLABLE,否则如果您要查找不匹配的行,则键列是最好的。这是因为它是我们可以保证在两个表连接的情况下包含空值的唯一列,并且此表中没有数据与其他表匹配
为了更好地解释,这里有一些数据:
A
key|val
-------
000|hello
001|world
B
key|val
-------
000|hello
002|there
如果A或B中的key
列包含NULL,则该行永远不会出现在连接结果中
答案 1 :(得分:-3)
找到答案。
这不起作用的原因是因为我在JOIN上使用AND条件而不是在WHEREclause中。
无论如何,谢谢大家!