SQL Join返回不匹配的结果

时间:2017-08-23 09:35:11

标签: mysql sql

我有一个表A和一个表B.我想加入A到B但只需要连接不可能的结果。我试过了

    SELECT B.* 
      FROM A 
RIGHT JOIN B ON A.KEY = B.KEY 
     WHERE A.KEY IS NULL

这应该有效,但事实并非如此。我的SQL上面是否正确?

2 个答案:

答案 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
  • 如果这两个表是INNER JOINED,则只会产生行000
  • 如果这两个表是A LEFT JOIN B ON A.KEY = B / KEY WHERE B.KEY为NULL,则行001将结果
  • 如果这两个表是A RIGHT JOIN B ON A.KEY = B / KEY WHERE A.KEY为NULL,则行002将结果
  • 如果这两个标记是完全外部连接,其中a或b键为null,则行001和002将生成

如果A或B中的key列包含NULL,则该行永远不会出现在连接结果中

答案 1 :(得分:-3)

找到答案。

这不起作用的原因是因为我在JOIN上使用AND条件而不是在WHEREclause中。

无论如何,谢谢大家!