【发布时间】:2017-01-31 11:30:40
【问题描述】:
我有下表:
DECLARE @P AS TABLE
(
ID int,
PID int,
PNAME NVARCHAR(30),
PARENT_PNAME NVARCHAR(30),
Error int
)
INSERT INTO @P VALUES
(554,1,'AAAA',NULL,0),
(554,2,'BBBB',NULL,0),
(554,3,'CCCC',NULL,0),
(554,4,'DDDD','AAAA',0),
(554,5,'EEEE','AAAA',0),
(554,6,'FFFF',NULL,0),
(554,7,'GGGG',NULL,0),
(554,8,'HHHH',NULL,0),
(554,9,'IIII',NULL,0),
(554,10,'JJJJ',NULL,0),
(554,11,'KKKK',NULL,0);
如果我运行以下查询:
select ID, PID, PNAME, PARENT_PNAME, Error
from @P
where PNAME not in (select PARENT_PNAME
from @P
where PNAME is not null)
AND PARENT_PNAME IS NOT NULL
我什么也得不到,没有结果。为什么“NOT IN”不起作用?
我需要获取以下两行:
(554,4,'DDDD','AAAA',0)
(554,5,'EEEE','AAAA',0)
【问题讨论】:
-
附带说明:对于您的示例数据,条件
where PNAME is not null无效,因为所有 PNAME 都不为空。 -
Chanukya 的回答是正确的(他是第一个写出正确解决方案的人,所以 +1),他没有解释为什么
NOT IN条件没有返回结果。原因是PARENT_PNAME的某些值是空的,所以它们不能在NOT IN运算符中使用。这将始终返回 false。 -
我不太确定您要应用的标准是什么 - 返回您提到的两行有不同的标准。
标签: sql-server sql-server-2008 sql-server-2008-r2 notin