MSSQLのアナログLIMIT

MSSQLには、MySQLのLIMIT関数に相当するものがありません(TOPを除く)。 しかし、かなり頻繁に、特定の範囲の値を最初からではなく、たとえば1000番目から選択する必要があります。


いくつかの可能なオプションがあります:

1.最初から最後まで必要な値を選択し、スクリプトに渡します出力時には、不要な値をカットします。

SELECT TOP n * FROM TABLE ORDER BY id
nは最後の要素の番号です
id-一意の識別子

大きなテーブルで作業する場合、実行に非常に長い時間がかかり、小さなテーブルにのみ適しています

2.私たちは、に基づいて発生しないという条件で選択を行います

SELECT TOP n id,* FROM TABLE
WHERE id not in (SELECT TOP (n - m) id FROM TABLE)
ORDER BY id

nは最後の要素の番号です
mは必要な要素の数です
id-一意の識別子

場合によっては最初の方法よりも少し速く動作し、単純なクエリの条件下で十分に大きなテーブルを処理するのに適しています

3.最後に、row_number()を使用する最後のメソッド、ほとんどすべてのテーブルで最速の作業

WITH num_row
AS
(
SELECT row_number() OVER (ORDER BY id) as nom , *
FROM TABLE
)
SELECT * FROM num_row
WHERE nom BETWEEN (n - m) AND n

nは最後の要素の番号です
mは必要な要素の数です
id-一意の識別子

昨日、小さなパラドックスに気づきました。メソッド3の選択は、同じテーブル(6,000万行を超える)からSELECT TOP nを選択するよりもずっと速く機能しました。

PSこれはハブに関する私の最初のトピックです。厳密に判断しないでください。

Source: https://habr.com/ru/post/J54448/


All Articles