Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/sql-server-2008/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server SQL Server:不在where子句中不使用NVARCHAR_Sql Server_Sql Server 2008_Sql Server 2008 R2_Notin - Fatal编程技术网

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