TOP (Transact-SQL)
Указывает на то, что будет возвращен только первый набор строк из результата запроса. Набор строк может быть либо числом, либо процентом. Выражение TOP может быть использовано в инструкциях SELECT, INSERT, UPDATE, MERGE и DELETE.
Синтаксис
[
TOP (expression) [PERCENT]
[ WITH TIES ]
]
Аргументы
expression
Числовое выражение, которое задает количество возвращаемых строк. Аргумент expression прямо преобразуется в значение типа float, если указан PERCENT. В противном случае преобразуется в тип bigint.Круглые скобки, в которые заключено выражение expression в предложении TOP, в инструкциях INSERT, UPDATE, MERGE и DELETE являются обязательными. В целях обратной совместимости использование TOP expression без скобок в инструкции SELECT поддерживается, но не рекомендуется к использованию.
Если запрос включает предложение 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.
Замечания
Предложение TOP не может быть использовано вместе с инструкциями UPDATE и DELETE для секционированных представлений.
Строки, на которые ссылается выражение TOP, используемое с инструкцией INSERT, UPDATE, MERGE или DELETE, не расположены в определенном порядке. 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. Чтобы убедиться в том, что вставлены первые две строки из вложенного запроса SELECT, перепишите запрос следующим образом.
INSERT INTO Table2 (ColumnB)
SELECT TOP (2) ColumnA FROM Table1
ORDER BY ColumnA;
SQL Server позволяет обновлять представления, которые были созданы с предложением TOP. Так как в определение представления включено предложение TOP, определенные строки могут исчезнуть из представления из-за обновления, если результат более не соответствует требованиям выражения TOP. Дополнительные сведения см. в разделе Изменение данных через представление.
Выражение TOP в запросе не влияет на инструкции, которые могут быть выполнены из-за срабатывания триггера. В таблицах inserted and updated в триггерах отображаются только строки, которые действительно были подвергнуты изменениям в инструкциях INSERT, UPDATE, MERGE или DELETE.
Использование предложения TOP в инструкции MERGE
Если предложение TOP указано в инструкции MERGE, то применяется после соединения всей исходной таблицы и всей целевой таблицы и удаления соединенных строк, которые не рассматриваются как предназначенные для выполнения операций вставки, обновления или удаления. Предложение TOP дополнительно сокращает количество соединенных строк до указанного значения, а затем к оставшимся соединенным строкам применяются операции вставки, обновления или удаления без учета порядка. Иными словами, порядок, в котором строки подвергаются операциям, определенным в предложениях WHEN, не задан. Например, если указано TOP (10), то под операции подпадают 10 строк; из них 7 могут быть обновлены, а 3 вставлены, либо 1 удалена, 5 обновлены, а 4 вставлены, и т. д.
Инструкция MERGE выполняет полный просмотр исходной и целевой таблиц, поэтому при использовании предложения TOP для изменения большой таблицы путем создания нескольких пакетов производительность ввода-вывода может снизиться. В этом случае необходимо обеспечить, чтобы во всех подряд идущих пакетах осуществлялась обработка новых строк. Дополнительные сведения см. в разделе Оптимизация производительности инструкции MERGE.
Примеры
А. Использование предложения TOP с переменными
Следующий пример использует переменные для получения первых 10 работников, перечисленных в таблице dbo.Employee базы данных AdventureWorks.
USE AdventureWorks;
GO
DECLARE @p AS int;
SELECT @p=10
SELECT TOP(@p)*
FROM HumanResources.Employee;
GO
Б. Использование предложения TOP с параметрами PERCENT и WITH TIES
Следующий пример извлекает первые 10 процентов работников с наибольшей зарплатой и возвращает их в порядке убывания базовой ставки зарплаты. Указание параметра WITH TIES позволяет быть уверенным в том, что все работники с зарплатой, равной минимальной возвращенной зарплате, включены в результирующий набор, даже если это приведет к превышению ограничения в 10 процентов работников.
USE AdventureWorks;
GO
SELECT TOP(10) PERCENT WITH TIES
c.FirstName, c.LastName, e.Title, e.Gender, r.Rate
FROM Person.Contact AS c
INNER JOIN HumanResources.Employee AS e
ON c.ContactID = e.ContactID
INNER JOIN HumanResources.EmployeePayHistory AS r
ON r.EmployeeID = e.EmployeeID
ORDER BY Rate DESC;