Table_A
ID Rev Description
-----------------------------------
1 1 Some text.
1 2 Some text. Adding more.
1 3 Some text. Ading more & more.
以上將不斷增加新的一行時,用戶更新的說明。
我想用MAX(Rev)[即最新描述]。
爲了得到這個我做了以下內容:
;with AllDescriptions As
(
select
ID
, Rev
, Description
, ROW_NUMBER() over (partition by ID order by Rev desc) as RowNum
from Table_A
Where ID = 1
)
select ID, Rev, Description from AllDescription
where RowNum = 1
最近,我看到了一個不同的方法來獲得相同的結果
select b.* from
(
select ID, MAX(Rev) as MaxRev
from Table_A
where ID = 1
group by ID
) as a
inner join
(
select ID, Rev, Description from Table_A where ID = 1
) as b
on a.ID = b.ID and a.MaxRev = b.Rev
從學習的角度來看,我想知道上述兩個哪方法更好?或者如果還有更好的方法來做同樣的事情?
檢查執行計劃。第2版可能會展示一些單尋求加分區優化器的魔力。我以前見過這個例子,不記得在哪裏。 * SQL Server 2008內部:T-SQL編程*,也許? – 2010-09-07 23:41:10
@Peter - 我似乎還記得,他們在這些書中忘記了細節,對'JOIN'或'TOP 1'進行了比較。 – 2010-09-07 23:45:15
我剛剛試過兩種方法 - '統計信息IO'爲這兩個選項提供了幾乎相同的讀取次數,並在表上支持聚簇索引。查詢計劃認爲ROW_NUMBER變體的價格要高得多。 '查詢相對於批量的成本' - 但我認爲在這種情況下這是誤導性的。 – 2010-09-07 23:55:37