2017-01-31 5 views
2

У меня есть ниже таблице:SQL Server: NOT IN в пункте, где не работает с NVARCHAR

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) 
+0

На стороне записки: с, например, данные, условие 'где PNAME не является нулевым 'не имеет никакого эффекта, потому что все PNAME не равны нулю. –

+1

Возможный дубликат значений [NOT IN и NULL] (http://stackoverflow.com/questions/129077/not-in-clause-and-null-values) –

+1

Ответ Чанукки правильный (и он был первым, кто написал правильное решение, так что +1 для этого). Он не объясняет, почему условие NOT IN не возвращает никаких результатов. Причина в том, что некоторые значения 'PARENT_PNAME' ноль, поэтому они не могут использоваться в операторе' NOT IN'. который всегда будет возвращать false. –

ответ

4
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 * from @P where PARENT_PNAME is not null 

выход

ID PID PNAME PARENT_PNAME Error 
554 4 DDDD AAAA 0 
554 5 EEEE AAAA 0 
1

Вы должны также добавить and PARENT_PNAME is not 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 

Именно по этой причине вы не получите никаких результатов.

Для more detailed information have a look here.

1

Не требуется статья NOT IN. Просто попробуйте:

SELECT * FROM @P where PARENT_PNAME is NOT NULL 
0
select ID, PID, PNAME, PARENT_PNAME, Error 
from @P     
where PNAME<>PARENT_PNAME 
     AND PARENT_PNAME IS NOT NULL 

Не используйте NotIN для сравнения, когда у вас есть нулевые значения, используйте NOT EXISTS