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これはハブに関する私の最初のトピックです。厳密に判断しないでください。



All Articles