Aar*_*mer 2 t-sql sql-server sql-server-2005
我正在使用MS Sql 2005.
为什么这会给我正确的结果(返回169行)...
select
*
from
[import_Data]
where
[import_Data].name not in
(
select
[import_Data].name
from
[import_Data]
inner join [resource] on [import_Data].name = [resource].name
where
[import_Data].ProviderTypeID = 4
and [resource].IsDeleted = 0
)
and [import_Data].ProviderTypeID = 4
Run Code Online (Sandbox Code Playgroud)
但这不(返回0行)......
select
*
from
[import_Data]
where
[import_Data].name not in
(
select
[resource].name
from
[resource]
where
IsDeleted = 0
)
and [import_Data].ProviderTypeID = 4
Run Code Online (Sandbox Code Playgroud)
name列之间的唯一区别是[resource].nameis varchar(500)和[import_Data].nameis varchar(300).
我的猜测是资源表中有一个null resource.name,它会抛弃所有的比较.为什么空值会导致问题?根据"Guru对TSQL的指导",我正在解释"ANSI指南声明将相等值与NULL进行比较的表达式总是返回NULL." 所以列表中的任何null都会抛出整个事物.
在您的第一个查询中,您的内部联接将排除这些空值.
所以你有三个选择
使用相关子查询(警告空中代码)不存在的示例
SELECT *
FROM [import_Data]
WHERE NOT EXISTS(
select [resource].name from [resource] where IsDeleted = 0 AND [resource].name = [import_Data].name
)
AND [import_Data].ProviderTypeID = 4
Run Code Online (Sandbox Code Playgroud)