SQL NOT IN - PullRequest
       17

SQL NOT IN

3 голосов
/ 03 февраля 2010

У меня запрос, который не работает должным образом

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 работает правильно без NOT IN

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

Ответы [ 3 ]

19 голосов
/ 03 февраля 2010

у вас есть значение 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()

См. Также Выбрать все строки из одной таблицы, которые не существуют в другой таблице

2 голосов
/ 03 февраля 2010

как насчет использования левого соединения?

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 голосов
/ 28 апреля 2015

Существует другая ситуация: подзапрос может ничего не возвращать.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**)

, которая гарантируетподзапрос будет содержать хотя бы одно число.

...