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?

Foi útil?

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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top