SQL 不存在包括空值
SQL Not Exists include null value
我有两个 SQL 服务器 table :
Table 1
Id name description version
----------------------------------
1 Book1 Book 1 Title v1
2 Book2 Book 2 Title v2
3 Book3 Book 3 Title NULL
4 Book5 Book 5 Title v3
Table 2
Id name description version
----------------------------------
1 Book1 Book 1 Title v1
2 Book2 Book 2 Title v2
3 Book3 Book 3 Title NULL
4 Book4 Book 4 Title NULL
5 Book5 Book 5 Title NULL
我想 select table 2 中 table 1 中不存在的所有数据,这样我就可以
将它们插入另一个 table.
这是 SQL 查询:
SELECT t2.name, t2.description, t2.version
FROM Table2 AS t2
WHERE
NOT EXISTS (SELECT t1.name, t1.description, t1.version
FROM Table1 as t1
WHERE t2.name = t1.name
AND t2.description = t1.description
AND t2.version = t1.version)
预期的结果是这样的:
Id name description version
-----------------------------------
4 Book4 Book 4 Title NULL
5 Book5 Book 5 Title NULL
但我得到的是这个:
Id name description version
---------------------------------
3 Book3 Book 3 Title NULL
4 Book4 Book 4 Title NULL
为什么在我的 NOT EXIST
语句中不评估空值并显示空值?
NULL 值与任何东西进行比较时都会 return FALSE。您将需要使用 IS NULL
来处理
select t2.name, t2.description, t2.version
from Table2 as t2
WHERE NOT EXISTS
(
SELECT *
FROM Table1 as t1
WHERE t2.name = t1.name
AND t2.description = t1.description
AND (
t2.version = t1.version
OR (t2.version IS NULL AND t1.version IS NULL)
)
)
你可以使用 EXCEPT 来解决这个问题。
您可以使用两个表中的公共字段,然后 select 来自该结果的数据。
看下面这段代码:
SELECT name, description, version FROM Table2
EXCEPT
SELECT name, description, version FROM Table1
此代码为您提供表 2 中存在而表 1 中不存在的数据。
优化查询:
SELECT t2.name, t2.description, t2.version
FROM Table2 AS t2
LEFT JOIN Table1 AS t1
ON t2.name = t1.name
AND t2.description = t1.description
AND (t2.version = t1.version
OR (t2.version IS NULL AND t1.version IS NULL))
WHERE t1.ID is NULL
您可以简单地使用 ISNULL()
函数:
SELECT t2.name, t2.description, t2.version
FROM Table2 AS t2
WHERE
NOT EXISTS (SELECT t1.name, t1.description, t1.version
FROM Table1 as t1
WHERE t2.name = t1.name
AND t2.description = t1.description
AND ISNULL(t2.version,0) = ISNULL(t1.version,0)
我有两个 SQL 服务器 table :
Table 1
Id name description version
----------------------------------
1 Book1 Book 1 Title v1
2 Book2 Book 2 Title v2
3 Book3 Book 3 Title NULL
4 Book5 Book 5 Title v3
Table 2
Id name description version
----------------------------------
1 Book1 Book 1 Title v1
2 Book2 Book 2 Title v2
3 Book3 Book 3 Title NULL
4 Book4 Book 4 Title NULL
5 Book5 Book 5 Title NULL
我想 select table 2 中 table 1 中不存在的所有数据,这样我就可以 将它们插入另一个 table.
这是 SQL 查询:
SELECT t2.name, t2.description, t2.version
FROM Table2 AS t2
WHERE
NOT EXISTS (SELECT t1.name, t1.description, t1.version
FROM Table1 as t1
WHERE t2.name = t1.name
AND t2.description = t1.description
AND t2.version = t1.version)
预期的结果是这样的:
Id name description version
-----------------------------------
4 Book4 Book 4 Title NULL
5 Book5 Book 5 Title NULL
但我得到的是这个:
Id name description version
---------------------------------
3 Book3 Book 3 Title NULL
4 Book4 Book 4 Title NULL
为什么在我的 NOT EXIST
语句中不评估空值并显示空值?
NULL 值与任何东西进行比较时都会 return FALSE。您将需要使用 IS NULL
来处理
select t2.name, t2.description, t2.version
from Table2 as t2
WHERE NOT EXISTS
(
SELECT *
FROM Table1 as t1
WHERE t2.name = t1.name
AND t2.description = t1.description
AND (
t2.version = t1.version
OR (t2.version IS NULL AND t1.version IS NULL)
)
)
你可以使用 EXCEPT 来解决这个问题。 您可以使用两个表中的公共字段,然后 select 来自该结果的数据。
看下面这段代码:
SELECT name, description, version FROM Table2
EXCEPT
SELECT name, description, version FROM Table1
此代码为您提供表 2 中存在而表 1 中不存在的数据。
优化查询:
SELECT t2.name, t2.description, t2.version
FROM Table2 AS t2
LEFT JOIN Table1 AS t1
ON t2.name = t1.name
AND t2.description = t1.description
AND (t2.version = t1.version
OR (t2.version IS NULL AND t1.version IS NULL))
WHERE t1.ID is NULL
您可以简单地使用 ISNULL()
函数:
SELECT t2.name, t2.description, t2.version
FROM Table2 AS t2
WHERE
NOT EXISTS (SELECT t1.name, t1.description, t1.version
FROM Table1 as t1
WHERE t2.name = t1.name
AND t2.description = t1.description
AND ISNULL(t2.version,0) = ISNULL(t1.version,0)