0

計算列が含まれていますが、基本的なselectステートメントを実行する次のselectSQLがあります。

    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つのselectステートメント(または1つでも)に減らす方法はありますか?実際にRowNumberを返す必要はありません。特定の範囲内の行を選択するためにのみ使用されます。

4

1 に答える 1

0

レビューに対して元の選択で行番号を入力することにより、2つでそれを行うことができます。ROW_NUMBERのようなウィンドウ関数にWHERE句が必要な場合は、1つに移動することはできません。

2回書き込む必要がありますがTotalFoundUseful + TotalFoundNotUseful、評価されるのは1回だけなので、パフォーマンスには影響しません。

また、2つに移動してもパフォーマンスに影響はないと思いますが、テストする必要があります。

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
于 2012-05-23T15:00:37.500 に答える