Вопрос

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

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 не возвращает ничего, даже если я знаю, что эти идентификаторы не в Tale_x Q2 работает правильно без не в

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

Это было полезно?

Решение

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

попробуй это

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 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()

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

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**)

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top