当存在NULL值结果时,NOT IN子查询失败

jre*_*121 3 sql-server null notin

对不起伙计们,我不知道怎么说这个,但我在where子句中有以下内容:

person_id not in (
    SELECT distinct person_id
    FROM protocol_application_log_devl pal
    WHERE pal.set_id = @set_id
)
Run Code Online (Sandbox Code Playgroud)

当子查询没有返回结果时,我的整个select都无法返回任何内容.为了解决这个问题,我person_id在子查询中替换了isnull(person_id, '00000000-0000-0000-0000-000000000000').

它似乎有效,但是有更好的方法来解决这个问题吗?

Tim*_*ter 6

NOT EXISTS无论如何最好使用:

WHERE NOT EXISTS(
    SELECT 1 FROM protocol_application_log_devl pal
    WHERE pal.person_id = person_id
     AND  pal.set_id = @set_id
)
Run Code Online (Sandbox Code Playgroud)

我应该使用NOT IN,OUTER APPLY,LEFT OUTER JOIN,EXCEPT还是NOT EXISTS?

我看到的一种模式,并希望我没有,不是.当我看到这种模式时,我感到畏缩.但不是出于性能原因 - 毕竟,它在这种情况下创建了一个足够好的计划:

主要问题是如果目标列是NULLable,结果可能会令人惊讶(SQL Server将其处理为左反半连接,但无法可靠地告诉您右侧的NULL是否等于 - 或不等于 - 左侧的参考).此外,如果列可以为NULL,则优化可能会有不同的行为,即使它实际上不包含任何NULL值

而不是NOT IN,对此查询模式使用相关的NOT EXISTS. 永远.当所有其他变量相同时,其他方法可以在性能方面与其竞争,但所有其他方法都会引入性能问题或其他挑战.