CTE与子查询不匹配

时间:2014-07-24 17:17:30

标签: sql sql-server tsql

我一直在尝试重写以下查询。

Select distinct A.Account
  from SourceTable A 
 where A.ActivityDate = ( select MAX(ActivityDate) 
                           from SourceTable B 
                          where b.Account = A.Account )
   and A.Status = 'M'

我转到了CTE:

;With TableCTE as 
( Select Account,
         row_number() Over (partition by Account order by ActivityDate desc) as Rn 
    From SourceTable
   Where Status = 'M')

Select Account From TableCTE Where Rn  = 1

我希望这些查询具有相同的结果,但是,第一个获得大约170k行,第二个获得大约380k(不,它不产生重复)。

任何想法我为什么得到不同的金额?

1 个答案:

答案 0 :(得分:3)

您在不同的地方应用A.Status = 'M'条件:

在查询1中,您要求的行中包含最高ActivityDateStatus = 'M'

的行

在查询2中,您要求 ActivityDate

行中Status = 'M' 行最高的行

你的CTE查询的直接SQL等价物是:

Select distinct A.Account
from SourceTable A 
where A.ActivityDate = ( select MAX(ActivityDate) 
                           from SourceTable B 
                          where b.Account = A.Account 
                          and b.Status = 'M'
                       )
    and a.Status = 'M'

(假设ActivityDate每个Account

是唯一的