Tu SQL NOT IN está roto (y nadie te lo dijo)
Si alguna vez ejecutaste un subquery con NOT IN y te devolvió nada — ni una sola fila — no estás loco. La base de datos no está rota. Está haciendo exactamente lo que el spec de SQL dice que debe hacer.
El truco es que NOT IN no es realmente un operador especial. Es NOT (columna IN (...)). Entonces, cuando tu subquery devuelve un NULL, todo se colapsa. 5 NOT IN (1, 2, NULL) es NOT (5 = 1 AND 5 = 2 AND 5 = NULL), y 5 = NULL es NULL, no TRUE. Así que obtienes NULL, que se trata como FALSE. Todo desaparece.
¿La solución? Usa NOT EXISTS o LEFT JOIN ... IS NULL si tus datos tienen NULLs. O envuelve el subquery en COALESCE. Pero honesto, la mayoría de nosotros solo le damos vuelta y seguimos.
Por qué nos importa: muchos de nosotros que programamos, armamos side hustles, o manejamos bases de datos en el trabajo hemos estado escribiendo queries que devuelven resultados incorrectos en silencio — y nos hemos estado echando la culpa por meses.
“Tu base de datos no está rota. Está haciendo exactamente lo que el spec dice — solo que no estabas prestando atención.”