Pregunta

Tengo una consulta que no funciona como se esperaba

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 no devuelve nada aunque sé que esas ID no están en table_x Q2 se ejecuta correctamente sin no estar en

¿Qué podría estar mal con mi consulta?

¿Fue útil?

Solución

Tienes un valor nulo en la tabla

prueba esto

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

o esto

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

Ver también Seleccione todas las filas de una tabla que no existan en otra tabla

Otros consejos

¿Qué hay de usar una unión a la izquierda?

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

Hay otra situación: la subconsulta no puede devolver nada. SQL Server no funciona como se esperaba si la cláusula no en la cláusula devuelve una lista nula. Tengo una consulta como la siguiente:

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

Cuando la subconsulta contiene una lista de ID, la consulta devolverá los datos como se esperaba. Pero cuando la subconsulta no devuelve nada, la consulta aún devolverá datos, pero luego se atasca.

Cambié la consulta a lo siguiente y resolví el problema:

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

Lo que asegura que la subconsulta contenga al menos un número.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top