空值和联接
联接表的列中的空值(如果有)互相不匹配。如果其中一个联接表的列中出现空值,只能通过外部联接返回这些空值(除非 WHERE 子句不包括空值)。
下面的两个表中,每个表中要参与联接的列中均包含 NULL 值:
table1 table2
a b c d
------- ------ ------- ------
1 one NULL two
NULL three 4 four
4 join4
将列 a 中的值与列 c 中的值进行比较的联接不能获得包含 NULL 值的列的匹配结果:
SELECT *
FROM table1 t1 JOIN table2 t2
ON t1.a = t2.c
ORDER BY t1.a
而是只返回列 a 和列 c 中值为 4 的一行:
a b c d
----------- ------ ----------- ------
4 join4 4 four
(1 row(s) affected)
另外,从基表返回的空值与从外部联接返回的空值很难区分开。例如,下面的 SELECT 语句对这两个表进行左向外部联接:
SELECT *
FROM table1 t1 LEFT OUTER JOIN table2 t2
ON t1.a = t2.c
ORDER BY t1.a
下面是结果集:
a b c d
----------- ------ ----------- ------
NULL three NULL NULL
1 one NULL NULL
4 join4 4 four
(3 row(s) affected)
从结果中很难区分数据中的 NULL 值和表示联接失败的 NULL 值。如果联接的数据有空值,最好用常规联接从结果中删除这些空值。
请参阅
其他资源
sp_dbcmptlevel (Transact-SQL)
WHERE (Transact-SQL)