我有以下選擇SQL,做了基本的select語句雖然它包括計算列:T-SQL:簡化SELECT語句ROW_NUMBER
Select *
From
(
Select *,
ROW_NUMBER() OVER
(ORDER BY
CASE WHEN @sortBy = 0 THEN R.DateCreated End Desc,
CASE WHEN @sortBy = 1 THEN R.DateCreated end Asc,
CASE WHEN @sortBy = 2 THEN TotalVotes END Desc,
CASE WHEN @sortBy = 2 THEN R.TotalFoundNotUseful END Desc
) AS RowNumber
From
(
Select *, (TotalFoundUseful + TotalFoundNotUseful) As TotalVotes
From Reviews
Where (DealID = @dealID) And (TotalAbuses < 10) And (Deleted = 0)
) As R
) As Rev
Where RowNumber BETWEEN @startRecord AND @endRecord
如果你仔細看,在SELECT語句本身在執行3次。我無法相信這是必要的。有沒有辦法將其減少到2個選擇語句(甚至可能是一個)。我實際上並不需要返回RowNumber。它僅用於選擇一定範圍內的行。
'SELECT'不會執行三次。 SQL Server將擴展派生表定義。 –
評語表僅命中一次,在最裏面的選擇,過濾和總#records計數。下一個外層選擇將順序和行號添加到第一個,最外層僅返回數據頁面。對我來說這似乎相當有效,因爲任何分頁策略也需要知道過濾器中的總行數(在分頁之前)。 – StuartLC
我猜我認爲正在發生的事情是,每次執行Select語句時,SQL Server將在遍歷所有記錄。所以如果我在最內層的Select中有10條記錄,那麼中間的Select也會重複10次以執行排序。然後,對於最外層的Select,整個事情會完成10次以上,這實際上導致10x10x10 = 1000次迭代。 – AndroidDev