Sql server SQL Server:不在where子句中不使用NVARCHAR
我有以下表格:Sql server SQL Server:不在where子句中不使用NVARCHAR,sql-server,sql-server-2008,sql-server-2008-r2,notin,Sql Server,Sql Server 2008,Sql Server 2008 R2,Notin,我有以下表格: 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
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
我一无所获,一无所获。为什么“不在”不起作用
我需要获得以下两行:
(554,4,'DDDD','AAAA',0)
(554,5,'EEEE','AAAA',0)
输出
ID PID PNAME PARENT_PNAME Error
554 4 DDDD AAAA 0
554 5 EEEE AAAA 0
您还应该在嵌套查询中添加
,并且父\u PNAME不为null
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
)
AND PARENT_PNAME IS NOT NULL
这就是你没有得到任何结果的原因
对于。您不需要
不在子句中。试试看:
SELECT * FROM @P where PARENT_PNAME is NOT NULL
选择ID、PID、PNAME、PARENT\u PNAME、Error
来自@P
其中PNAMEPARENT\u PNAME
并且父\u PNAME不为空
当您有空值时,不要使用NotIN进行比较,请使用NOT Exists有许多方法可以获得所需的结果
--method 1
select ID, PID, PNAME, PARENT_PNAME, Error
from @P P1
where EXISTS (select PARENT_PNAME
from @P P2
where p2.PNAME = p1.PNAME
and P1.PARENT_PNAME is not null)
--query 2
select P1.*
from @P P1
where P1.PARENT_PNAME is not null
附带说明:对于您的示例数据,PNAME不为null的条件无效,因为所有PNAME都不为null。Chanukya答案的可能重复项是正确的(他是第一个写出正确答案的人,因此+1),他没有解释为什么不在
条件不会返回任何结果。原因是PARENT\u PNAME
的某些值为空,因此它们不能用于而不是运算符中。这将总是返回false。我不太确定您想要应用的标准是什么-返回您提到的两行有不同的标准。
select ID, PID, PNAME, PARENT_PNAME, Error
from @P
where PNAME<>PARENT_PNAME
AND PARENT_PNAME IS NOT NULL
--method 1
select ID, PID, PNAME, PARENT_PNAME, Error
from @P P1
where EXISTS (select PARENT_PNAME
from @P P2
where p2.PNAME = p1.PNAME
and P1.PARENT_PNAME is not null)
--query 2
select P1.*
from @P P1
where P1.PARENT_PNAME is not null