左联接不返回空记录

时间:2018-12-20 11:14:52

标签: sql sql-server null

我正在处理一个非常基本的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中的值不同。

2 个答案:

答案 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 JOINTableB的记录。这会强制引擎仅 显示来自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