Cláusula SQL NOT IN

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 esos identificadores no están en table_x Q2 se ejecuta correctamente sin NOT IN

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

tienes un valor NULO en la tabla

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

Consulte también Seleccionar todas las filas de una tabla que no existen en otra tabla

¿Qué hay de usar una combinación 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 NOT IN devuelve una list 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 list de identificadores, la consulta devolverá los datos como se esperaba. Pero cuando la subconsulta no devuelve nada, la consulta seguirá devolviendo datos, pero luego se queda atascada.

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 less un número.