在对两个表进行排他左联接时,是否需要为两个(或可能更多)键写条件'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
到目前为止,它只适用于一种情况,但我只是感到困惑,我看到这是一个简单的问题,对此感到抱歉
答案 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
);