TOPとOFFSETの両方& FETCHは次の目的で使用できます。返される行数を制限します。 OFFSETとFETCHは同様の結果をトップに返すことができますが、特定の状況で使用するのに最適な方法に影響を与える可能性のある違いがあります。
このレッスンのすべての例は、Microsoft SQL ServerManagementに基づいています。 StudioとAdventureWorks2012データベース。これらの無料ツールの使用を開始するには、ガイドSQLServer入門ガイドを使用してください。
TOPとOFFSETの違いは何ですか&フェッチ?
次のセクションでは、TOPとOFFSET & FETCHについて説明します。両方のセクションを読めば、それらの違いを理解できると思います。これらは、この記事の最後にある表にもまとめられています。
Top
TOPは、クエリ結果から特定の行数を返すために使用されます。
TOP句は、SQL 2005などの古いバージョンのSQLサーバーでしばらくの間使用可能でした。TOPはANSIに準拠しておらず、その使用はSQLServerやMS-AccessなどのMicrosoft製品に限定されています。
TOP句はSELECTステートメントの列リストで使用され、ORDERBYの有無にかかわらず使用できます。
たとえば、使用する最も安価な10個の製品を選択するには
SELECT TOP 10 Name, ProductNumber, StandardCostFROM Production.ProductORDER BY StandardCost
ORDER BYは必須ではありませんが、ORDER BYがないと、どの行が返されるか保証されないため、ベストプラクティスです。
TOPに固有の1つのアイテム行のパーセンテージを返す機能です。ステートメント
SELECT TOP 10 PERCENT Name, ProductNumber, StandardCostFROM Production.ProductORDER BY StandardCost
は、StandardCostが最も低い上位51の製品を返します(つまり、504行x 10%= 50.4、51に切り上げ)。
クエリ結果の下部から指定した数のレコードを選択することもできます。これを行うには、トリックを使用してレコードを降順で並べ替えることができます。
SELECT TOP 10 Name, ProductNumber, StandardCostFROM Production.ProductORDER BY StandardCost DESC
結果を降順で並べ替える場合は、次の点に注意してください。最大金額が最初に返されます。このため、TOPは標準コストが最も高い製品を返します。
数千行を返すとパフォーマンスに影響する可能性があるため、TOPは大きな結果に非常に役立ちます。多くの場合、使用は結果の最初の部分を参照するだけです。
TOPはタイの値を表示できます– WITH TIESを使用すると、基本結果の最後の行と同じ値を持つ追加のレコードを表示することもできます。
OFFSETとFETCH
OFFSETとFETCHは、結果セットからレコードのウィンドウを返すために使用されます。 OFFSETは、結果内でスキップする行数を指定し、FETCHは、その時点から結果に戻る行数を指定します。
OFFSETとFETCHはSQLServer 2012で最近導入され、ANSIに準拠しています。
FETCHなしでOFFSETを使用できますが、FETCHを単独で使用することはできません。とにかく、OFFSETはORDERBY句とともに使用する必要があります。 OFFSETとFETCHはORDERBY句の一部であるため、理由は単純です。
この例では、結果の最初の10行がスキップされ、次の10行が結果に表示されます。
SELECT Name, ProductNumber, StandardCostFROM Production.ProductORDER BY StandardCost OFFSET 10 ROWS FETCH NEXT 10 ROWS ONLY
結果が順序付けられていれば、OFFSETとFETCHを使用してTOPから返された行を複製できます。次のステートメントは、TOP10を返すのと同じです。
SELECT Name, ProductNumber, StandardCostFROM Production.ProductORDER BY StandardCost OFFSET 0 ROWS FETCH NEXT 10 ROWS ONLY
OFFSETが0に設定されている場合、行はスキップされません。
TOP、OFFSETには、行のパーセンテージを返す手段が組み込まれていません。ただし、パーセンテージを次のように計算することで、独自にロールすることができます。
SELECT Name, ProductNumber, StandardCostFROM Production.ProductORDER BY StandardCost OFFSET 0 ROWS FETCH NEXT (SELECT CAST(CEILING(COUNT(*) * .1) as INT) FROM Production.Product) ROWS ONLY
トリックはサブクエリにあります。結果の行数を計算することで、パーセンテージを取得できます。これがサブクエリです。必要に応じて、SQL Server ManagementStudioでこれを実行できます。
SELECT CAST(CEILING(COUNT(*) * .1) as INT)FROM Production.Product
いくつかの項目があります注:
- CEILINGは数値を切り上げます。この例では、CEILING(50.4)は51.0を返します。これはTOPの動作を模倣します。
- FETCHは整数値を必要とするため、CASTを使用してその変換を行います。したがって、51.0は次のようになります。51
結果の下位10レコードを返すには、2つの方法があります。 TOPの場合と同じように、並べ替え順序を逆にすることができます。
SELECT Name, ProductNumber, StandardCostFROM Production.ProductORDER BY StandardCost DESC OFFSET 0 ROWS FETCH NEXT 10 ROWS ONLY
または、並べ替え順序を保持して、最後までのすべての行が含まれるようにオフセットを計算することもできます。 10はスキップされます。この手法については、OFFSETとFETCHに関するSQLレッスンで詳しく説明します。
違いの概要
TOPとOFFSETの主な違いの概要を次に示します&フェッチ。
一般に、最初の数行だけを返すことが目的の場合、TOPは単純な解決策だと思います。 ページングソリューションを探している場合、または元の並べ替え順序に影響を与えずにクエリ結果の中央または下部の行を選択する必要がある場合は、OFFSET & FETCHだと思います。 最高です。