SQL中not in有Null值时
SQL中not in有Null值时一、实例数据
Table_A表和Table_B表
CREATE TABLE [dbo].[Table_A](
[ID] [nchar](10) NULL,
[Name] [nchar](10) NULL
) ON [PRIMARY]
GO
ID Name
001 张三
002 李四
003 王五
CREATE TABLE [dbo].[Table_B](
[ID] [nchar](10) NULL,
[Name] [nchar](10) NULL
) ON [PRIMARY]
GO
ID Name
NULL 张三
002 李四
NULL 王五
二、查询出在Table_A表中不在Table_B表中的记录
1、错误SQL写法 (没有任何结果返回)
SELECT *
FROM dbo.Table_A AS a
WHERE a.ID NOT IN ( SELECT b.ID
FROM dbo.Table_B AS b)
2、错误原因
(1)、如果null参与算术运算,则该算术表达式的值为null。(例如:+,-,*,/ 加减乘除)
(2)、如果null参与比较运算,则结果可视为false。(例如:>=,<=,<> 大于,小于,不等于)
(3)、如果null参与聚集运算,则聚集函数都置为null。除count(*)之外。
(4)、如果在not in子查询中有null值的时候,则不会返回数据。
例如
SELECT *
FROM dbo.TableA AS a
WHERE a.id NOT IN ( 2, NULL )
--等同于:
SELECT *
FROM Table_A AS a
WHERE a.id <> 2
AND a.ID <> NULL
--由于NULL值不能参与比较运算符,导致条件不成立,查询不出来数据。
3、正确SQL写法
--写法1
SELECT *
FROM dbo.Table_A AS a
WHERE a.ID NOT IN ( SELECT b.ID
FROM dbo.Table_B AS b
WHERE b.ID IS NOT NULL ) --排除NULL值参与运算符比较
--写法2
SELECT *
FROM dbo.Table_A AS a
WHERE NOT EXISTS ( SELECT *
FROM dbo.Table_B AS b
WHERE a.ID = b.ID )