2012-05-23 96 views
0

我有以下選擇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。它僅用於選擇一定範圍內的行。

+2

'SELECT'不會執行三次。 SQL Server將擴展派生表定義。 –

+0

評語表僅命中一次,在最裏面的選擇,過濾和總#records計數。下一個外層選擇將順序和行號添加到第一個,最外層僅返回數據頁面。對我來說這似乎相當有效,因爲任何分頁策略也需要知道過濾器中的總行數(在分頁之前)。 – StuartLC

+0

我猜我認爲正在發生的事情是,每次執行Select語句時,SQL Server將在遍歷所有記錄。所以如果我在最內層的Select中有10條記錄,那麼中間的Select也會重複10次以執行排序。然後,對於最外層的Select,整個事情會完成10次以上,這實際上導致10x10x10 = 1000次迭代。 – AndroidDev

回答

0

您可以通過將ROWNUMBER與原來的選擇對評論有兩個這樣做。如果您想在ROW_NUMBER之類的窗口函數上使用WHERE子句,則無法使用該子句。

你必須寫TotalFoundUseful + TotalFoundNotUseful兩次,但它使不影響性能只計算一次。

我也不會想到搬到兩對性能有任何影響,但你應該對它進行測試。

Select * 
    From 
    (
    Select *, (TotalFoundUseful + TotalFoundNotUseful) As TotalVotes, 
      ROW_NUMBER() OVER 
       (ORDER BY 
      CASE WHEN @sortBy = 0 THEN DateCreated End Desc, 
      CASE WHEN @sortBy = 1 THEN DateCreated end Asc, 
      CASE WHEN @sortBy = 2 THEN TotalFoundUseful + TotalFoundNotUseful END Desc, 
      CASE WHEN @sortBy = 2 THEN TotalFoundUseful END Desc 
     ) AS RowNumber 
From Reviews 
    Where (DealID = @dealID) And (TotalAbuses < 10) And (Deleted = 0) 

) As Rev 
    Where RowNumber BETWEEN @startRecord AND @endRecord 
+0

除了我現在發現的一個問題之外,這很有用。如果我有兩個記錄,其中TotalFoundUseful = 100,但是一個記錄有TotalFoundNotUseful = 5,其他= 3,5個記錄出現在前其次是一個具有3我想它周圍的其他方法。帶3的那個應該先來。我修改了最後一個CASE語句爲TotalFoundNotUseful END ASC,但這不起作用。 – AndroidDev

+0

因此,當@Sortby = 2時,它首先按totalvotes排序,然後按TotalFoundUseful排序。您正在使用的問題數據的總票數是多少? –