sql server - Why same EXISTS returns different result -
each policynumber
can have multiple classcode
. goal eliminate whole policynumber
related columns including classcode's
if @ least 1 classcode
chosen eliminated. have cte1
policynumber
, writtenpremium
(wp) , have table tblclasscodesplazacommercial
policynumber
, classcode
. in where
clause im choosing:
where exists ( select distinct policynumber tblclasscodesplazacommercial policynumber not in (select policynumber tblclasscodesplazacommercial classcode =5151) )
then if select * cte3 classcode =5151
still have policies classcode 5151
the entire select statement below:
select cte1.policynumber, cte1.transactioneffectivedate, cc.classcode, case when row_number() on (partition cte1.quoteid, cte1.policynumber, cc.transactioneffectivedate order (select 0))=1 cte1.wp else 0 end wp--, cte1 inner join tblclasscodesplazacommercial cc on cte1.policynumber=cc.policynumber , cte1.quoteid=cc.quoteid , cte1.transactioneffectivedate=cc.transactioneffectivedate exists (select distinct policynumber tblclasscodesplazacommercial policynumber not in (select policynumber tblclasscodesplazacommercial classcode =5151))
but then, if declare @policiesthatdonthaveclasscodes table policynumber's dont have classcode 5151 , use in exists command - works.
declare @policiesthatdonthaveclasscodes table (policynumber varchar(100)) insert @policiesthatdonthaveclasscodes select distinct policynumber tblclasscodesplazacommercial policynumber not in (select policynumber tblclasscodesplazacommercial classcode =5151) select cte1.policynumber, cte1.transactioneffectivedate, cc.classcode, case when row_number() on (partition cte1.quoteid, cte1.policynumber, cc.transactioneffectivedate order (select 0))=1 cte1.wp else 0 end wp--, cte1 inner join tblclasscodesplazacommercial cc on cte1.policynumber=cc.policynumber , cte1.quoteid=cc.quoteid , cte1.transactioneffectivedate=cc.transactioneffectivedate exists (select * @policiesthatdonthaveclasscodes t t.policynumber=cc.policynumber )
what difference? both sub-queries returns same result set. why in first case doesn't work, in second (when declared @policiesthatdonthaveclasscodes) - works? how can achieve same result without declaring table variables?
in first sample provide
where exists (select distinct policynumber tblclasscodesplazacommercial policynumber not in (select policynumber tblclasscodesplazacommercial classcode =5151))
there no correlation between outer query , subquery. evaluate subquery in isolation and, since query returns row, where exists …
true.
in second example correlate subquery outer query, that's t.policynumber = cc.policynumber
does, because cc
outside subquery:
where exists (select * @policiesthatdonthaveclasscodes t t.policynumber=cc.policynumber )
so result of subquery (potentially) different every single row of outer query.
thus 2 where
clauses evaluate differently.
edit
possible reworking of first predicate
where not exists (select 1 tblclasscodesplazacommercial t t.policynumber = cc.policynumber , t.classcode = 5151)
Comments
Post a Comment