TOP(Transact-SQL)

  • 2017年3月16日
  • 読むのに11分
    • V
    • M
    • r
    • c
    • d
    • +12

適用対象: SQL Server(サポートされているすべてのバージョン) AzureSQLデータベース AzureSQLマネージドインスタンス Azure Synapse Analytics 並列データウェアハウス

クエリ結果セットで返される行を、SQLServerで指定された行数または行の割合に制限します。 TOPをORDERBY句とともに使用すると、結果セットは順序付けられた行の最初のN個に制限されます。それ以外の場合、TOPは最初のN行を未定義の順序で返します。この句を使用して、SELECTステートメントから返される行数を指定します。または、TOPを使用して、INSERT、UPDATE、MERGE、またはDELETEステートメントの影響を受ける行を指定します。

Transact-SQL構文規則

構文

以下はSQLServerとAzureSQLデータベースの構文です:

以下はAzureSynapseAnalyticsとParallelの構文ですデータウェアハウス:

SQL Server 2014以前のTransact-SQL構文を表示するには、以前のバージョンのドキュメントを参照してください。 。

引数

expression
返される行数を指定する数値式。 PERCENTを指定すると、式は暗黙的にfloat値に変換されます。それ以外の場合、式はbigintに変換されます。

PERCENT
クエリが結果セットの行の最初の式パーセントのみを返すことを示します。小数値は次の整数値に切り上げられます。

タイ付き
限定された結果セットの最後の場所にタイである2つ以上の行を返します。この引数は、ORDERBY句とともに使用する必要があります。 WITH TIESを使用すると、式で指定された値よりも多くの行が返される場合があります。たとえば、式が5に設定されているが、追加の2行が行5のORDER BY列の値と一致する場合、結果セットには7行が含まれます。

WITHTIESを使用してTOP句を指定できます。 SELECTステートメントでのみ引数を指定し、「ORDERBY句も指定した場合のみ。レコードを結ぶために返される順序は任意です。ORDERBYはこのルールに影響しません。

ベストプラクティス

SELECTステートメントでは、常にORDERBY句をTOP句とともに使用します。なぜなら、これがTOPの影響を受ける行を予測可能に示す唯一の方法だからです。

クエリページングソリューションを実装するには、TOP句の代わりにORDER BY句でOFFSETとFETCHを使用します。ページングソリューション(つまり、データのチャンクまたは「ページ」をクライアントに送信することは、OFFSET句とFETCH句を使用して実装する方が簡単です。詳細については、ORDER BY句(Transact-SQL)を参照してください。

TOP(または返される行数を制限するために、SET ROWCOUNTの代わりにOFFSETおよびFETCH)。これらのメソッドは、次の理由からSETROWCOUNTを使用するよりも優先されます。

  • SELECTステートメントの一部として、クエリオプティマイザクエリの最適化中にTOP句またはFETCH句の式の値を考慮することができます。クエリを実行するステートメントの外部でSETROWCOUNTを使用するため、その値をクエリプランで考慮することはできません。

互換性のサポート

後方互換性のために、式が整数constの場合、SELECTステートメントでは括弧はオプションです。蟻。 SELECTステートメントのTOPには常に括弧を使用することをお勧めします。そうすることで、INSERT、UPDATE、MERGE、およびDELETEステートメントで必要な使用法との一貫性が提供されます。

相互運用性

TOP式は、トリガーが原因で実行される可能性のあるステートメントには影響しません。トリガーに挿入および削除されたテーブルは、INSERT、UPDATE、MERGE、またはDELETEステートメントによって実際に影響を受ける行のみを返します。たとえば、TOP句を使用したINSERTステートメントの結果としてINSERTTRIGGERが起動した場合。

SQL Serverでは、ビューを介して行を更新できます。ビュー定義にTOP句を含めることができるため、更新のために行がTOP式の要件を満たさなくなった場合、特定の行がビューから消えることがあります。 。

MERGEステートメントで指定されている場合、TOP句は、ソーステーブル全体とターゲットテーブル全体が結合された後に適用されます。また、挿入、更新、または削除の対象とならない結合された行アクションは削除されます。 TOP句は、結合された行の数を指定された値にさらに減らし、挿入、更新、または削除のアクションは、順序付けられていない方法で残りの結合された行に適用されます。つまり、WHEN句で定義されたアクション間で行が分散される順序はありません。たとえば、TOP(10)を指定すると10行に影響する場合、これらの行のうち7つが更新され、3つが挿入されます。または、1つを削除し、5つを更新し、4つを挿入するというようになります。 MERGEステートメントはソーステーブルとターゲットテーブルの両方の全表スキャンを実行するため、TOP句を使用して複数のバッチを作成して大きなテーブルを変更すると、I / Oパフォーマンスに影響を与える可能性があります。このシナリオでは、連続するすべてのバッチが新しい行をターゲットにしていることを確認することが重要です。

UNION、UNION ALL、EXCEPT、またはINTERSECTを含むクエリでTOP句を指定する場合は注意が必要です。オペレーター。 TOP句とORDERBY句が論理的に処理される順序は、これらの演算子をselect操作で使用すると必ずしも直感的ではないため、予期しない結果を返すクエリを作成することができます。たとえば、次の表とデータを前提として、最も安価な赤い車と最も安価な青い車を返品するとします。つまり、赤いセダンと青いバンです。

これらの結果を得るには、次のクエリを記述します。

結果セットは次のとおりです。

TOP句は、演算子(この場合はUNION ALL)の結果を並べ替えるORDER BY句の前に論理的に実行されるため、予期しない結果が返されます。したがって、前のクエリは、任意の1台の赤い車と1台の青い車を返し、その結合の結果を価格で並べ替えます。次の例は、目的の結果を達成するためにこのクエリを記述する正しい方法を示しています。

副選択操作でTOPとORDERBYを使用することにより、ORDERBY句の結果がTOPに適用されるようにします。 UNION操作の結果を並べ替えないようにします。

結果セットは次のとおりです。

制限と制限

TOPをINSERT、UPDATE、MERGE、またはDELETEとともに使用する場合、参照される行は任意の順序で配置されません。また、これらのステートメントでORDERBY句を直接指定することはできません。 TOPを使用して、意味のある時系列で行を挿入、削除、または変更する必要がある場合は、subselectステートメントで指定されたORDERBY句を指定してTOPを使用します。この記事の次の例のセクションを参照してください。

パーティションビューのUPDATEおよびDELETEステートメントでTOPを使用することはできません。

TOPをOFFSETおよびFETCHと組み合わせることはできません。同じクエリ式(同じクエリスコープ内)。詳細については、ORDER BY句(Transact-SQL)を参照してください。

カテゴリ 注目の構文要素
基本構文 TOP•PERCENT
タイ値を含む タイ付き
DELETE、INSERT、またはUPDATEの影響を受ける行を制限する DELETE•INSERT•UPDATE

基本構文

このセクションの例は、最低限必要な構文を使用したORDERBY句の基本機能を示しています。

A。定数値でのTOPの使用

次の例では、定数値を使用して、クエリ結果セットで返される従業員の数を指定します。最初の例では、ORDER BY句が使用されていないため、最初の10行の未定義の行が返されます。2番目の例では、ORDER BY句を使用して、最近雇用された上位10人の従業員が返されます。

B。変数を使用したTOPの使用

次の例では、変数を使用して、クエリ結果セットで返される従業員の数を指定しています。

C。パーセンテージの指定

次の例では、PERCENTを使用して、クエリ結果セットで返される従業員の数を指定しています。290があります。 HumanResources.Employeeテーブルの従業員。290の5%は小数値であるため、値は次の整数に切り上げられます。

タイ値を含める

A. WITH TIESを使用して、最後の行の値と一致する行を含める

次の例では、最上位の10給与が最も高い全従業員の割合ndは、給与に応じて降順で返します。 WITH TIESを指定すると、10従業員の割合。

DELETE、INSERT、またはUPDATEの影響を受ける行を制限する

A。 TOPを使用して削除される行数を制限する

DELETEでTOP(n)句を使用すると、n個の行の未定義の選択に対して削除操作が実行されます。つまり、DELETEステートメントは、WHERE句で定義された条件を満たす任意の(n)行を選択します。次の例では、期限が2002年7月1日より前の20行をPurchaseOrderDetailテーブルから削除します。

TOPを使用して意味のある時系列で行を削除する場合は、副選択ステートメントでTOPとORDERBYを使用します。次のクエリは、最も早い期日を持つPurchaseOrderDetailテーブルの10行を削除します。 10行のみが削除されるようにするために、副選択ステートメントで指定された列(PurchaseOrderID)がテーブルの主キーです。 subselectステートメントで非キー列を使用すると、指定した列に重複する値が含まれている場合、10行を超える行が削除される可能性があります。

B。 TOPを使用して挿入される行数を制限する

次の例では、テーブルEmployeeSalesを作成し、上位5つの名前と年初来の売上データを挿入します。テーブルHumanResources.Employeeの従業員。 INSERTステートメントは、SELECTステートメントによって返される、WHERE句で定義された条件を満たす5行を選択します。 OUTPUT句は、EmployeeSalesテーブルに挿入された行を表示します。 SELECTステートメントのORDERBY句は、上位5人の従業員の決定には使用されないことに注意してください。

TOPを使用して意味のある時系列で行を挿入する場合は、TOPとORDERBYを使用します。 subselectステートメント。次の例は、これを行う方法を示しています。OUTPUT句は、EmployeeSalesテーブルに挿入された行を表示します。結果に基づいて上位5人の従業員が挿入されていることに注意してください。未定義の行の代わりにORDERBY句を使用します。

C.TOPを使用して更新される行数を制限する

次の例TOP句を使用してテーブルの行を更新します。UPDATEでTOP(n)句を使用すると、更新操作は未定義の行数で実行されます。つまり、UPDATEステートメントは一致する任意の(n)行数を選択します。 WHERE句で定義された基準。次の例では、ある営業担当者から別の営業担当者に10人の顧客を割り当てます。

必要な場合TOPを使用して意味のある時系列で更新を適用するには、subselectステートメントでTOPをORDERBYと一緒に使用する必要があります。次の例では、10人の従業員の休暇時間を最も早い雇用日で更新します。

例:Azure SynapseAnalyticsとParallelData Warehouse

次の例は、クエリ条件に一致する上位31行を返します。 ORDER BY句は、LastName列のアルファベット順に基づいて返される31行が最初の31行であることを保証します。

タイを指定せずにTOPを使用します。

結果:31行が返されます。

TOPを使用して、WITHTIESを指定します。

結果:ブラウンという名前の3人の従業員が31行目に同点であるため、33行が返されます。

関連項目

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です