15

私はこのような表現を探しています(SQL Server 2008を使用)

SELECT TOP 10 columName FROM tableName

しかし、その代わりに 10 から 20 の間の値が必要です。そして、SELECT ステートメントを 1 つだけ使用してそれを行う方法があるのだろうかと思います。

たとえば、これは役に立たない:

SELECT columName FROM
(SELECT ROW_NUMBER() OVER(ORDER BY someId) AS RowNum, * FROM tableName) AS alias
WHERE RowNum BETWEEN 10 AND 20

括弧内の選択はすでにすべての結果を返しているため、パフォーマンスのためにそれを避けたいと考えています。

4

5 に答える 5

10

row_numberすべての行をソートする必要のないトリックがあります。

これを試して:

SELECT columName
FROM (SELECT ROW_NUMBER() OVER(ORDER BY (select NULL as noorder)) AS RowNum, *
      FROM tableName
     ) as alias
WHERE RowNum BETWEEN 10 AND 20

では定数を使用できませんorder by。ただし、定数に評価される式を使用できます。SQL Server はこれを認識し、適切に列挙された行を返すだけです。

于 2012-11-16T19:00:27.057 に答える
8

SQL Server 2012 を使用してフェッチ/スキップしてください!

SELECT SalesOrderID, SalesOrderDetailID, ProductID, OrderQty, UnitPrice, LineTotal
FROM AdventureWorks2012.Sales.SalesOrderDetail
OFFSET 10 ROWS FETCH NEXT 10 ROWS ONLY;

古いバージョンの SQL Server について説明している以上に優れたものはありません。おそらくCTEを使用しますが、違いはありません。

WITH NumberedMyTable AS
(
    SELECT
        Id,
        Value,
        ROW_NUMBER() OVER (ORDER BY Id) AS RowNumber
    FROM
        MyTable
)
SELECT
    Id,
    Value
FROM
    NumberedMyTable
WHERE 
    RowNumber BETWEEN @From AND @To  

または、上位 10 行を削除してから次の 10 行を取得することもできますが、誰でもそうしたいと思うでしょう。

于 2012-11-16T18:55:23.283 に答える
3

SQL Server が内部クエリ全体を評価するのはなぜだと思いますか? 並べ替え列にインデックスが付けられていると仮定すると、最初の 20 個の値が読み取られます。あなたが本当に緊張しているなら、これを行うことができます:

Select
  Id 
From (
  Select Top 20 -- note top 20
    Row_Number() Over(Order By Id) As RowNum,
    Id 
  From
    dbo.Test
  Order By
    Id
  ) As alias
Where
  RowNum Between 10 And 20
Order By
  Id

しかし、クエリプランはどちらの方法でも同じであると確信しています。

(本当に)アーロンのコメントに従って修正されました。

http://sqlfiddle.com/#!3/db162/6

于 2012-11-16T19:07:05.163 に答える
1

もう1つのオプション

SELECT TOP(11) columName
FROM dbo.tableName
ORDER BY
CASE WHEN ROW_NUMBER() OVER (ORDER BY someId) BETWEEN 10 AND 20 
     THEN ROW_NUMBER() OVER (ORDER BY someId) ELSE NULL END DESC
于 2012-11-17T14:53:27.237 に答える
0

次のように順序付けされた一時テーブルを作成できます。

SELECT ROW_NUMBER() OVER(ORDER BY someId) AS RowNum, * FROM tableName into ##tempTable ...

そうすれば、行の順序付きリストが得られます。内部クエリを複数回実行する代わりに、行番号でクエリを実行できます。

于 2014-06-16T19:18:35.337 に答える