我正在处理一个非常基本的SQL查询,但是我不明白为什么不匹配的记录不能在右表中用空值表示。
我有一个带有复合键的表A和表B,并且在表B中有一些数据,我知道它们与表A中的键不匹配。但是,结果集仅返回具有匹配键的行,而没有不匹配(空)记录。
SELECT *
FROM TableA a LEFT JOIN
TableB b
ON a.Field1 = b.Field1 AND
a.Field2 = b.Field2
WHERE b.Field1 IS NULL
我期望看到表A中的记录和表B中的不匹配以Null表示的记录。
编辑************************************************** **************
链接示例数据和表格:
https://drive.google.com/file/d/1PNlyqO4mwMBOGgQnWVlduiDKaDjSaE8v/view?usp=sharing
应该看到TableB中的最后一条记录,因为Field5的值与TableA中的值不同。
答案 0 :(得分:0)
当您将null放到where子句时,您的SQL会采用内部联接。试试这个:
SELECT *
FROM TableA a LEFT JOIN
TableB b
ON a.Field1 = b.Field1 AND
a.Field2 = b.Field2 AND
B.Field1 is null and B.Field2 is null <== Added.
答案 1 :(得分:0)
尝试的问题是,您从TableA
中的记录开始,然后是LEFT JOIN
对TableB
的记录。这会强制引擎仅 显示来自TableA
的记录,如果匹配则显示来自TableB
的其他行/列,而不显示来自TableB
的不匹配的记录在TableA
上。
您想要颠倒加入顺序:
SELECT
*
FROM
TableB b
LEFT JOIN TableA a ON
a.Field1 = b.Field1 AND
a.Field2 = b.Field2
WHERE
a.Field1 IS NULL -- records from A table shouldn't exist
或作为RIGHT JOIN
SELECT
*
FROM TableA a RIGHT JOIN
TableB b
ON a.Field1 = b.Field1 AND
a.Field2 = b.Field2
WHERE a.Field1 IS NULL -- records from A table shouldn't exist
或者如果您希望同时显示两者中的记录,则使用FULL JOIN
,即使另一个表上没有匹配项(没有WHERE
子句):
SELECT
*
FROM TableA a FULL JOIN
TableB b
ON a.Field1 = b.Field1 AND
a.Field2 = b.Field2