0

以下のクエリは、テーブルから行 10 から行 20 までの行のサブセットをフェッチします。さらに、クエリを保存するには、テーブル内の行の総数を返す必要があります。これは私が考えることができる最善の解決策です。もっと効率的/エレガントな方法はありますか? 特に好きではないpartition by 1部分があります。

select *
from (select count(*) over (partition by 1) as [count],
             row_number() over (order by [Name],[Description]) as [row],
             *
      from [Products]) as t
where row between 10 and 20
4

1 に答える 1

1

嫌なら削除!

select *
from (select count(*) over () as [count],
             row_number() over (order by [Name],[Description]) as [row],
             *
      from [Products]) as t
where row between 10 and 20

ただし、それはさておき、クエリは最適ではありません。従来の方法でカウントを行う必要があります。

select *
from (select count(*) as [count]
        from [Products]) X
cross join (
    select row_number() over (order by [Name],[Description]) as [row],
           *
      from [Products]) as t
where row between 10 and 20

これらの両方をまとめて Ctrl-M を押してから実行できます。計画はかなり異なって見えます。

于 2012-11-01T18:16:36.013 に答える