我试图替换EXIST,因为它效率低下,但我想出了不同的结果。为什么?

时间:2013-11-07 18:04:51

标签: sql sql-server performance case exists

所以我有这个查询运行一个存在的语句,但是当我去替换它时,它没有返回相同数量的值,因为“暂停审计,EIC观察”和#39; 它实际上回报较少。

代码的旧部分在注释中,新代码直接在它之后。

SELECT  t.flngKey AS flngTaskKey,
    t.fstrAccountType,
    t.fstrTaskSource,
    CASE    t.fstrCategory 
        WHEN    '' THEN '' 
        ELSE    t.fstrTaskSource + '_CAT_' + t.fstrCategory 
    END AS fstrCategory,

这是旧部分

CASE
        --WHEN t.fstrType = '' THEN '' 
        --WHEN wd.fstrWorkType  = 'SUSIN1'
        --AND   wd.fstrOwner        =  ' ' 
        --AND   wd.flngworkkey      =  wr.flngworkkey 
        --AND   wr.fstrAccountType  <> '007' 
        --AND   wr.fblnOpen         =  1 
        --AND Exists
        --  (SELECT 1 
        --  FROM    tblIndicator id
        --  WHERE   id.fstrIndicator   = 'EIWTCH' 
        --  AND id.flngVer=0    
        --  --AND   fdtmCease       > @pdtmRunDate 
        --  AND id.flngAccountKey  = wd.flngAccountKey)
        --THEN 'Suspended for Audit Indicator - EIC Watch For'
        --ELSE  t.fstrTaskSource + '_TYP_' + t.fstrType 
        --END AS fstrType,

这是新的

CASE
WHEN t.fstrType = '' THEN '' 
    WHEN wd.fstrWorkType    = 'SUSIN1'
    AND wd.fstrOwner        =  ' ' 
    AND wd.flngworkkey      =  wr.flngworkkey 
    AND wr.fstrAccountType  <> '007' 
    AND wr.fblnOpen         =  1 
    AND id.fstrIndicator   = 'EIWTCH' 
    AND id.flngVer=0
    AND id.flngAccountKey  = wd.flngAccountKey
    THEN 'Suspended for Audit Indicator - EIC Watch For'
    ELSE    t.fstrTaskSource + '_TYP_' + t.fstrType 
    END AS fstrType,

两者的最后一部分是相同的(我知道它的冗余)

FROM    tblTaskOpen t with (nolock) LEFT OUTER JOIN tblWorkDetail wd
    ON t.flngKey=wd.flngWorkKey LEFT OUTER JOIN tblIndicator id
    ON t.flngAccountKey=id.flngAccountKey AND id.fstrIndicator='EIWTCH' AND id.flngVer=0, 
    tblWorktoReturn wr with (nolock) LEFT OUTER JOIN tblReturn r with (nolock) 
ON  wr.flngReturnKey  = r.flngReturnKey 
AND r.flngVer        = 0,
    t2                      


WHERE   t.fstrCategory   = 'RTNCOR' 
AND wr.flngWorkKey    = t.flngKey 
AND t.fstrCategory   = t2.fstrCategory 
AND t.fstrType       = t2.fstrType 

在任何一种情况下,我最终都将fstrIndicator设置为EIWTCH并将flngVer设置为0,这应该限制与&#34; t&#34;加入的记录数量。反正。

此EXISTS中发生的更多记录是什么?

感谢您的帮助!

1 个答案:

答案 0 :(得分:0)

这两个查询不一样。首先,您在LEFT OUTER JOINtblTaskOpen t之间使用tblWorkDetail wd。这将仅返回tblWorkDetail wd符合t.flngKey=wd.flngWorkKey的记录(以及来自tblTaskOpen t的所有其他记录,但这里不重要)。

因此,旧查询的EXISTS根本不会引用tblTaskOpen t。这意味着它甚至检查tblWorkDetail wd中最终未返回的记录是否存在。因此,对于直接检查新查询中的列的更多记录,此EXISTS可能会返回true。