Sql no en cláusula
-
25-09-2019 - |
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?
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.