在两个表上编写排他左联接的正确方法是什么?

时间:2019-07-01 18:52:29

标签: sql left-join

在对两个表进行排他左联接时,是否需要为两个(或可能更多)键写条件'is NULL'?问题是,“ WHERE B.columnName1 IS NULL”是否足够?

加入一个关键条件:

SELECT columns
FROM TableA
LEFT OUTER JOIN TableB
ON A.columnName = B.columnName
WHERE B.columnName IS NULL

以下内容更准确吗?我是否需要columnName2的条件?

SELECT columns
FROM TableA
LEFT OUTER JOIN TableB
ON A.columnName1 = B.columnName1
AND  A.columnName2 = B.columnName2
WHERE B.columnName1 IS NULL 
AND B.columnName2 IS NULL 

到目前为止,它只适用于一种情况,但我只是感到困惑,我看到这是一个简单的问题,对此感到抱歉

3 个答案:

答案 0 :(得分:2)

单列就足够了(只要它不能为空):

{{1}}

最佳做法是对表B使用主键

答案 1 :(得分:0)

ON子句包含联接的条件:

ON A.columnName = B.columnName

如果不满足此条件,则结果是表B的不匹配行的所有列均为NULL,因此您的第二个查询没有错。
但是,这也意味着B.columnName本身就是NULL,仅在WHERE子句中的这种条件就足够了。
这仅表示该行A.columnName没有匹配的B.columnName

答案 2 :(得分:0)

最佳做法是使用属于您代码的ON子句一部分的列:

SELECT columns
FROM TableA A LEFT OUTER JOIN 
     TableB B
     ON A.columnName = B.columnName
WHERE B.columnName IS NULL;

JOIN不能将NULL值视为相等。同样,主键(或主键的任何组件)也可以正常工作。

如果您不想考虑这一点,请使用NOT EXISTS

SELECT columns
FROM TableA A 
WHERE NOT EXISTS (SELECT 1
                  FROM TableB B
                  WHERE A.columnName = B.columnName
                 );