TOP (Transact-SQL)
クエリ結果の先頭から指定した行セットだけを返すよう指定します。行セットには、行数またはパーセントのいずれかを指定できます。TOP 式は、SELECT、INSERT、UPDATE、MERGE、および DELETE ステートメントで使用できます。
構文
[
TOP (expression) [PERCENT]
[ WITH TIES ]
]
引数
expression
返す行数を表す数式を指定します。PERCENT を指定した場合 expression は明示的に float 値に変換されます。それ以外の場合は bigint に変換されます。INSERT、UPDATE、MERGE、DELETE の各ステートメントで TOP を使用する場合は、expression を区切るかっこが必要です。旧バージョンとの互換性のため、SELECT ステートメントで TOP を使用する場合は expression をかっこで囲まなくても処理が行われますが、これは推奨されません。
クエリに ORDER BY 句が含まれている場合は、結果の先頭から expression で指定した行数、または expression で指定したパーセントが、ORDER BY 句で並べ替えられてから出力されます。クエリに ORDER BY 句が含まれていない場合は、任意の順序で行が出力されます。
PERCENT
クエリの結果セットの先頭から、expression で指定したパーセントの行のみを返すよう指定します。WITH TIES
ORDER BY のキー列の値が TOP n (PERCENT) の最終行と同じ値になっている行を、基本結果セットから追加行として返します。TOP...WITH TIES は SELECT ステートメントでのみ使用でき、ORDER BY 句が指定されている必要があります。注 同順位のレコードが返される順序は任意です。ORDER BY はこの規則に影響しません。
説明
パーティション ビューで、UPDATE および DELETE ステートメントと一緒に TOP を使用することはできません。
INSERT、UPDATE、MERGE、または DELETE と共に使用される TOP 式で参照される行は、任意の順序に並べられません。TOP n はランダムな n 行を返します。たとえば、次の INSERT ステートメントには ORDER BY 句が含まれていますが、この句は INSERT ステートメントが直接参照する行には影響しません。
INSERT TOP (2) INTO Table2 (ColumnB)
SELECT ColumnA FROM Table1
ORDER BY ColumnA;
このクエリの ORDER BY 句では、入れ子にされている SELECT ステートメントで返される行のみが参照されます。INSERT ステートメントでは、SELECT ステートメントで返された任意の 2 行が選択されます。SELECT サブクエリからの最初の 2 行が挿入されるようにするには、次のようにクエリを書き直します。
INSERT INTO Table2 (ColumnB)
SELECT TOP (2) ColumnA FROM Table1
ORDER BY ColumnA;
SQL Server では、TOP 句で作成されたビューを更新できます。TOP 句はビュー定義に含まれているので、結果が TOP 式の要件を満たさなくなると、更新したときに特定の行がビューから削除される場合があります。詳細については、「ビューを使用したデータ変更」を参照してください。
クエリ内の TOP 式は、トリガーが起動されたときに実行されるステートメントには影響しません。トリガー内で挿入および更新されたテーブルでは、INSERT、UPDATE、MERGE、または DELETE ステートメントによって実際に影響を受けた行のみが表示されます。
MERGE ステートメントでの TOP の使用
MERGE ステートメントで指定した TOP 句は、ソース テーブル全体と対象テーブル全体が結合され、挿入、更新、または削除操作の対象とならない結合された行が削除された後に適用されます。TOP 句を使用すると、結合された行の数が指定の値まで減少し、挿入、更新、または削除操作が残りの結合された行に順序付けなしで適用されます。つまり、WHEN 句で定義された各操作に行を割り当てる順序に決まりはありません。たとえば、TOP (10) と指定すると 10 行に影響し、そのうち 7 行が更新されて 3 行が挿入されたり、1 行が削除され、5 行が更新され、4 行が挿入されたりします。
MERGE ステートメントはソース テーブルと対象テーブルの両方のフル テーブル スキャンを実行するので、TOP 句を使用し、複数のバッチを作成して大きなテーブルを変更すると、I/O パフォーマンスが影響を受ける場合があります。この場合は、一連のすべてのバッチが新しい行を対象としていることを確認してください。詳細については、「MERGE ステートメントのパフォーマンスの最適化」を参照してください。
例
A. TOP を変数と一緒に使用する
次の例では、変数を使って、AdventureWorks2008R2 データベースの dbo.Employee テーブルにある最初の 10 人の従業員を取得します。
USE AdventureWorks2008R2;
GO
DECLARE @p AS int;
SELECT @p=10
SELECT TOP(@p)*
FROM HumanResources.Employee;
GO
B. TOP を PERCENT および WITH TIES と一緒に使用する
次の例では、給与の高い上位 10 パーセントの全従業員を取得し、結果を基本給の降順で返します。WITH TIES を指定すると、返された一番低い給与と同じ給与の従業員も返されるので、結果は全従業員の 10% を超える場合があります。
USE AdventureWorks2008R2;
GO
SELECT TOP(10) PERCENT WITH TIES
pp.FirstName, pp.LastName, e.JobTitle, e.Gender, r.Rate
FROM Person.Person AS pp
INNER JOIN HumanResources.Employee AS e
ON pp.BusinessEntityID = e.BusinessEntityID
INNER JOIN HumanResources.EmployeePayHistory AS r
ON r.BusinessEntityID = e.BusinessEntityID
ORDER BY Rate DESC;