SQL小贴式: 用NOT EXISTS 而不是 NOT IN !!!
当使用NOT IN进行过滤时, 比如NOT IN xxx 时, 如果 xxx 中有NULL值时, 就会一行也不返回 !
在 SQL 中,NOT IN 子查询遇到 NULL 值时会产生意外行为,主要因为 SQL 使用三值逻辑(TRUE、FALSE、UNKNOWN),而不是二值逻辑.
SQL 比较(如 =, IN)涉及 NULL 时,结果可能是 UNKNOWN(未知)。
而WHERE 子句只接受 TRUE 的行;UNKNOWN 或 FALSE 的行会被排除。
NOT IN 的内部逻辑:x NOT IN (a, b, NULL) 等价于 x != a AND x != b AND x != NULL。
如果 x != NULL 为 UNKNOWN,整个表达式为 UNKNOWN,导致行被排除。
所以一定要用 NOT EXISTS 替代 NOT IN:最稳健,避免 NULL 问题。
https://www.codebonobo.tech/post/38#SQL小贴式: 用NOT EXISTS 而不是 NOT IN !!!