SQL Server-使用NOT IN替代筛选器

时间:2018-07-30 19:40:46

标签: sql-server

我有这个查询,可以根据多个条件为我计数。

WHERE 
    *Other conditions* 
    AND ((WORKTYPE = 'SS' AND TOT_SUBTYPE IN ('SSSERREN', 'SSERRLT') AND TOT_TASKTYPE = 'CONS') 
         OR ISNULL(TOT_TASKTYPE,'CONS') IN ('CONS','CONSX'))

上面的语句将过滤除'WORKTYPE ='SS'AND TOT_SUBTYPE IN('SSSERREN','SSERRLT')'以外的所有内容的CONS,CONSX和NULL,并且仅过滤'CONS'

我的问题是,当工作类型为SS且TOT_TASKTYPE为SSSERREN和SSERRLT时,它在输出中提供了额外的一行,包括TOT_TASKTYPE ='CONSX'。

我尝试按如下所示修改查询:

    ((WORKTYPE = 'SS' AND TOT_SUBTYPE IN ('SSSERREN','SSERRLT') and 
    TOT_TASKTYPE = 'CONS')                                          
     OR 
    (WORKTYPE NOT IN ('SS'))
    AND
    ISNULL(TOT_TASKTYPE,'CONS') IN ('CONS','CONSX'))   

此查询为我提供了前面提到的条件的正确选项,但它从我的输出中删除了工作类型为'SS'的其他行项。

我进一步更改了查询,使其不同时包含在WORKTYPE和TOT_SUBTYPE中,但是要花很多时间才能执行。我不确定这是否可以提供所需的输出。

    ((WORKTYPE = 'SS' AND TOT_SUBTYPE IN ('SSSERREN','SSERRLT') and 
    TOT_TASKTYPE = 'CONS')                                          
    OR 
   (WORKTYPE NOT IN ('SS') AND TOT_SUBTYPE NOT IN ('SSSERREN','SSERRLT')
    AND
    ISNULL(TOT_TASKTYPE,'CONS') IN ('CONS','CONSX'))

还有其他方法可以修改代码,而不是使用“不输入”来解决我的问题吗?

1 个答案:

答案 0 :(得分:0)

还有另一种修改代码的方式,而不是使用NOT IN

我建议在not exists上使用in

我发现not exists的大部分时间表现都更好。