SQL não na cláusula
-
25-09-2019 - |
Pergunta
Eu tenho uma consulta que não está funcionando como esperado
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 não está retornando nada, mesmo que eu saiba
O que poderia estar errado com minha consulta?
Solução
você tem um valor nulo na tabela
tente isso
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()
ou isto
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()
Veja também Selecione todas as linhas de uma tabela que não existe em outra tabela
Outras dicas
Que tal usar uma junção à esquerda?
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()
Há outra situação: a subconsulta não pode retornar nada. O SQL Server não funciona conforme o esperado se a cláusula não retornar uma lista nula. Eu tenho uma consulta como a seguinte:
select * from table where id not in (select id from tableB where somecondition(x))
Quando a subconsulta contém uma lista de IDs, a consulta retornará os dados conforme o esperado. Mas quando a subconsulta não retorna nada, a consulta ainda retornará dados, mas depois fica preso.
Mudei a consulta para o seguinte e resolvi o problema:
select * from table where id not in (select id from tableB where somecondition(x) **union all select 0**)
que garante que a subconsulta conterá pelo menos um número.