2010-02-02 3 views
3

У меня есть запрос, который не работает, как ожидалосьSQL НЕ В пункте

Q1: 
SELECT id, name 
FROM vw_x 
WHERE id NOT IN (select pid from table_x) 
GROUP BY id, name 
Having max(c_date) > GETDATE() 

Q2: 
SELECT id, name 
FROM vw_x 
GROUP BY id, name 
Having max(c_date) > GETDATE() 

Q1 будет ничего не возвращаются, даже если я знаю, эти идентификаторы не table_x Q2 работает правильно без НЕ

Что может быть неправильным с моим запросом?

ответ

19

у вас есть значение NULL в таблице

попробовать этот

SELECT id, name 
FROM vw_x 
WHERE id NOT IN (select pid from table_x where pid is not null) 
GROUP BY id, name 
Having max(c_date) > GETDATE() 

или это

SELECT id, name 
FROM vw_x 
WHERE NOT EXISTS (select 1 from table_x where pid = vw_x.id ) 
GROUP BY id, name 
Having max(c_date) > GETDATE() 

Смотрите также Select all rows from one table that don't exist in another table

+0

u r right, я собирался опубликовать ответ за это спасибо :) –

+0

спасибо за новую ссылку очень хорошо –

2

что об использовании левой присоединиться?

SELECT id, name 
FROM vw_x 
LEFT JOIN table_x on id = pid 
WHERE pid IS NULL 
GROUP BY id, name 
Having max(c_date) > GETDATE() 
0

Есть еще одна ситуация: подзапрос не может ничего не возвращать. SQL Server не работает должным образом, если предложение NOT IN возвращает нулевой список. У меня есть запрос вроде следующего:

select * from table where id not in (select id from tableB where somecondition(x)) 

Когда подзапрос содержит список идентификаторов, запрос будет возвращать данные, как и ожидалось. Но когда подзапрос ничего не возвращает, запрос будет по-прежнему возвращать данные, но затем застревает.

Я изменил запрос к следующему и решить эту проблему:

select * from table where id not in (select id from tableB where somecondition(x) **union all select 0**) 

который убеждается подзапрос будет содержать по крайней мере один номер.

Смежные вопросы