Поделиться через


TOP (Transact-SQL)

Область применения: SQL Server База данных SQL Azure Управляемый экземпляр SQL Azure конечной точке аналитики платформы Аналитики Azure Synapse Analytics (PDW)в Microsoft FabricХранилище в базе данных Microsoft FabricSQL в Microsoft Fabric

Ограничивает число строк, возвращаемых в результирующем наборе запроса до заданного числа или процентного значения в SQL Server. При использовании TOP с предложением ORDER BY результирующий набор ограничен первым n число упорядоченных строк. В противном случае TOP возвращает первое n число строк в неопределенном порядке. Используйте это предложение, чтобы указать количество строк, возвращаемых из инструкции SELECT. Или используйте TOP, чтобы указать строки, затронутые INSERT, UPDATE, MERGEили инструкцией DELETE.

Соглашения о синтаксисе Transact-SQL

Синтаксис

Синтаксис для SQL Server и Базы данных SQL Azure:

[
    TOP (expression) [ PERCENT ]
    [ WITH TIES ]
]

Синтаксис для системы платформы Azure Synapse Analytics и Analytics (PDW):

[
    TOP ( expression )
    [ WITH TIES ]
]

Аргументы

выражение

Числовое выражение, определяющее количество возвращаемых строк. выражения неявно преобразуется в значение float , если указать . В противном случае expression преобразуется в формат bigint.

ПРОЦЕНТ

Указывает на то, что запрос возвращает только первые expression процентов строк из результирующего набора. Дробные значения округляются до следующего целого числа.

WITH TIES

Возвращает две или более строки, которые соперничают за последнее место в ограниченном результирующем наборе. Этот аргумент необходимо использовать с предложением ORDER BY. WITH TIES может привести к возврату больше строк, чем значение, указанное в выражении. Например, если для выражения задано значение , но две другие строки соответствуют значениям столбцов в строке 5, результирующий набор содержит семь строк.

Можно указать предложение TOP с аргументом WITH TIES только в операторах SELECT и только в том случае, если также указать предложение ORDER BY. Порядок возврата связанных записей произволен. ORDER BY не влияет на это правило.

Рекомендации

В инструкции SELECT всегда используйте предложение ORDER BY с предложением TOP. Это единственный способ прогнозировать, какие строки влияют на TOP.

Используйте OFFSET и FETCH в предложении ORDER BY вместо предложения TOP для реализации решения по страницам запроса. Решение по страницам (то есть отправка блоков или страниц данных клиенту) упрощает реализацию предложений OFFSET и FETCH. Дополнительные сведения см. в предложении SELECT — ORDER BY.

Используйте TOP (или OFFSET и FETCH) вместо SET ROWCOUNT, чтобы ограничить количество возвращаемых строк. Эти методы предпочтительнее использовать SET ROWCOUNT по следующим причинам:

  • В рамках инструкции SELECT оптимизатор запросов может рассмотреть значение выражения в предложениях TOP или FETCH во время оптимизации запросов. Так как вы используете SET ROWCOUNT за пределами инструкции, которая выполняет запрос, его значение не может рассматриваться в плане запроса.

Поддержка совместимости

Для обратной совместимости круглые скобки являются необязательными в SELECT операторах, если выражение является целочисленной константой. Мы рекомендуем всегда использовать скобки для TOP в инструкциях SELECT. Это обеспечивает согласованность с необходимым использованием в инструкциях INSERT, UPDATE, MERGEи DELETE.

Совместимость

Выражение TOP не влияет на инструкции, которые могут выполняться из-за триггера. Таблицы inserted и deleted в триггерах возвращают только строки, которые действительно влияют на INSERT, UPDATE, MERGEили операторы DELETE. Например, если INSERT TRIGGER возникает в результате INSERT инструкции, которая использовала предложение TOP.

то SQL Server позволяет обновлять строки через представления. Так как в определении представления можно включить предложение TOP, некоторые строки могут исчезнуть из представления, если строки больше не соответствуют требованиям выражения TOP из-за обновления.

При указании в инструкции MERGE предложение TOP применяется после всей исходной таблицы и соединения всей целевой таблицы. а также удаления соединенных строк, которые не соответствуют требованиям к вставке, обновлению или удалению. Предложение TOP дополнительно сокращает количество присоединенных строк к указанному значению, а действия вставки, обновления или удаления применяются к оставшимся присоединенным строкам неупорядоченным способом. То есть нет порядка, в котором строки распределяются между действиями, определенными в предложениях WHEN. Например, если указание TOP (10) влияет на 10 строк, можно обновить семь этих строк и три вставки. Или можно удалить, пять обновленных и четыре вставленных и т. д. Так как инструкция MERGE выполняет полную проверку таблицы исходных и целевых таблиц, производительность ввода-вывода может повлиять на использование предложения TOP для изменения большой таблицы путем создания нескольких пакетов. В этом случае необходимо сделать так, чтобы все последующие пакеты содержали только новые строки.

Используйте осторожность при указании предложения TOP в запросе, который содержит оператор UNION, UNION ALL, EXCEPTили INTERSECT. Можно написать запрос, возвращающий непредвиденные результаты, так как порядок, в котором предложения TOP и ORDER BY логически обрабатываются, не всегда интуитивно понятны, когда эти операторы используются в операции выбора. Например, исходя из следующих таблиц и данных, предположим, что необходимо вернуть самый недорогой красный и синий автомобили. Иными словами, красный седан и синий фургон.

CREATE TABLE dbo.Cars
(
    Model VARCHAR (15),
    Price MONEY,
    Color VARCHAR (10)
);

INSERT dbo.Cars
VALUES ('sedan', 10000, 'red'),
    ('convertible', 15000, 'blue'),
    ('coupe', 20000, 'red'),
    ('van', 8000, 'blue');

Чтобы получить такие результаты, можно написать следующий запрос.

SELECT TOP (1) Model, Color, Price
FROM dbo.Cars
WHERE Color = 'red'
UNION ALL
SELECT TOP (1) Model, Color, Price
FROM dbo.Cars
WHERE Color = 'blue'
ORDER BY Price ASC;
GO

Вот результирующий набор.

 Model         Color      Price
 ------------- ---------- -------
 sedan         red        10000.00
 convertible   blue       15000.00

Непредвиденные результаты возвращаются, так как предложение TOP логически выполняется перед предложением ORDER BY, которое сортирует результаты оператора (UNION ALL в данном случае). Таким образом, предыдущие запросы вернут произвольный красный и произвольный синий автомобили, а затем отсортируют результат такого объединения по цене. Следующий пример показывает, как правильно написать запрос, который позволит получить нужный результат.

SELECT Model, Color, Price
FROM (SELECT TOP (1) Model, Color, Price
      FROM dbo.Cars
      WHERE Color = 'red'
      ORDER BY Price ASC) AS a
UNION ALL
SELECT Model, Color, Price
FROM (SELECT TOP (1) Model, Color, Price
      FROM dbo.Cars
      WHERE Color = 'blue'
      ORDER BY Price ASC) AS b;
GO

Используя TOP и ORDER BY в операции вложенного выбора, убедитесь, что результаты предложения ORDER BY применяются к предложению TOP, а не к сортировке результатов операции UNION.

Вот результирующий набор.

 Model         Color      Price
 ------------- ---------- -------
 sedan         red        10000.00
 van           blue        8000.00

Ограничения

При использовании TOP с INSERT, UPDATE, MERGEили DELETEссылки строки не упорядочивается в любом порядке. И вы не можете напрямую указать предложение ORDER BY в этих инструкциях. Если необходимо использовать TOP для вставки, удаления или изменения строк в понятном хронологическом порядке, используйте TOP с предложением ORDER BY, указанным в инструкции subselect. См. раздел примеров этой статьи.

Нельзя использовать TOP в инструкциях UPDATE или DELETE для секционированных представлений.

Невозможно объединить TOP с OFFSET и FETCH в одном выражении запроса (в той же области запроса). Дополнительные сведения см. в предложении SELECT — ORDER BY.

Примеры

Примеры кода Transact-SQL в этой статье используют пример базы данных AdventureWorks2022 или AdventureWorksDW2022, которую можно скачать на домашней странице примеров Microsoft SQL Server и проектов сообщества.

Категория Используемые элементы синтаксиса
Основной синтаксис TOP * PERCENT
Включить равные значения WITH TIES
Ограничение числа строк, обрабатываемых инструкциями DELETE, INSERT и UPDATE DELETE, INSERT, UPDATE

Основной синтаксис

Примеры в этом разделе демонстрируют основные функциональные возможности предложения ORDER BY с использованием минимального требуемого синтаксиса.

А. Использование TOP с константным значением

В следующих примерах константа указывает число сотрудников, возвращаемых в результирующем наборе запроса. В первом примере возвращаются первые 10 неопределенных строк, так как предложение ORDER BY не используется. Во втором примере предложение ORDER BY используется для возврата первых 10 недавно нанятых сотрудников.

USE AdventureWorks2022;
GO

-- Select the first 10 random employees.
SELECT TOP (10) JobTitle, HireDate
FROM HumanResources.Employee;
GO

-- Select the first 10 employees hired most recently.
SELECT TOP (10) JobTitle, HireDate
FROM HumanResources.Employee
ORDER BY HireDate DESC;
GO

B. Использование TOP с переменной

В следующем примере переменная указывает число сотрудников, возвращаемых в результирующем наборе запроса.

USE AdventureWorks2022;
GO

DECLARE @p AS INT = 10;

SELECT TOP (@p) JobTitle, HireDate, VacationHours
FROM HumanResources.Employee
ORDER BY VacationHours DESC;
GO

В. Указание процента

В следующем примере используется PERCENT, чтобы указать количество сотрудников, возвращаемых в результирующем наборе запросов. В таблице HumanResources.Employee содержится 290 сотрудников. 5 % от 290 является дробным числом, поэтому значение округляется вверх до целого числа.

USE AdventureWorks2022;
GO

SELECT TOP (5) PERCENT JobTitle, HireDate
FROM HumanResources.Employee
ORDER BY HireDate DESC;
GO

Включение значений галстуков

А. Использование WITH TIES для включения строк, соответствующих значениям в последней строке

Следующий пример извлекает первые 10 процентов работников с наибольшей зарплатой и возвращает их в порядке убывания зарплаты. Выбор WITH TIES гарантирует, что в результирующий набор будут включены все работники с минимальной в этом списке зарплатой, даже если это приведет к превышению ограничения в 10 процентов работников.

USE AdventureWorks2022;
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;
GO

Ограничение строк, затронутых DELETE, INSERT или UPDATE

А. Использование TOP для ограничения количества удаленных строк

При использовании предложения TOP (<n>) с DELETEоперация удаления выполняется при неопределенном выборе n числа строк. То есть оператор DELETE выбирает любое (n) количество строк, которые соответствуют критериям, определенным в предложении WHERE. Следующий пример удаляет из таблицы 20PurchaseOrderDetail строк с датой завершения до 1 июля 2002 г.

USE AdventureWorks2022;
GO

DELETE TOP (20)
FROM Purchasing.PurchaseOrderDetail
WHERE DueDate < '20020701';
GO

Если вы хотите использовать TOP для удаления строк в понятном хронологическом порядке, используйте TOP с ORDER BY в инструкции subselect. Следующий запрос удаляет из таблицы PurchaseOrderDetail 10 строк, имеющих самую раннюю дату. Чтобы гарантировать удаление только 10 строк, столбец, указанный в инструкции подзапроса выборки (PurchaseOrderID) должен являться первичным ключом таблицы. Использование столбца nonkey в инструкции subselect может привести к удалению более 10 строк, если указанный столбец содержит повторяющиеся значения.

USE AdventureWorks2022;
GO

DELETE Purchasing.PurchaseOrderDetail
WHERE PurchaseOrderDetailID IN (
    SELECT TOP 10 PurchaseOrderDetailID
    FROM Purchasing.PurchaseOrderDetail
    ORDER BY DueDate ASC
);
GO

B. Использование TOP для ограничения количества вставленных строк

В следующем примере создается таблица EmployeeSales и вставляется имя и данные о продажах за текущий год для 5 первых сотрудников из таблицы HumanResources.Employee. Оператор INSERT выбирает все пять строк, возвращаемых оператором SELECT, которые соответствуют критериям, определенным в предложении WHERE. Предложение OUTPUT отображает строки, вставляемые в таблицу EmployeeSales. Предложение ORDER BY в инструкции SELECT не используется для определения пяти лучших сотрудников.

USE AdventureWorks2022;
GO

IF OBJECT_ID('dbo.EmployeeSales', 'U') IS NOT NULL
    DROP TABLE dbo.EmployeeSales;
GO

CREATE TABLE dbo.EmployeeSales
(
    EmployeeID NVARCHAR (11) NOT NULL,
    LastName NVARCHAR (20) NOT NULL,
    FirstName NVARCHAR (20) NOT NULL,
    YearlySales MONEY NOT NULL
);
GO

INSERT TOP (5) INTO dbo.EmployeeSales
OUTPUT
    inserted.EmployeeID,
    inserted.FirstName,
    inserted.LastName,
    inserted.YearlySales
SELECT sp.BusinessEntityID,
       c.LastName,
       c.FirstName,
       sp.SalesYTD
FROM Sales.SalesPerson AS sp
     INNER JOIN Person.Person AS c
         ON sp.BusinessEntityID = c.BusinessEntityID
WHERE sp.SalesYTD > 250000.00
ORDER BY sp.SalesYTD DESC;
GO

Если вы хотите использовать TOP для вставки строк в понятном хронологическом порядке, используйте TOP с ORDER BY в инструкции subselect. В следующем примере показано, как это сделать. Предложение OUTPUT отображает строки, вставляемые в таблицу EmployeeSales. Первые пять сотрудников теперь вставляются на основе результатов предложения ORDER BY вместо неопределенных строк.

INSERT INTO dbo.EmployeeSales
OUTPUT
    inserted.EmployeeID,
    inserted.FirstName,
    inserted.LastName,
    inserted.YearlySales
SELECT TOP (5) sp.BusinessEntityID,
               c.LastName,
               c.FirstName,
               sp.SalesYTD
FROM Sales.SalesPerson AS sp
     INNER JOIN Person.Person AS c
         ON sp.BusinessEntityID = c.BusinessEntityID
WHERE sp.SalesYTD > 250000.00
ORDER BY sp.SalesYTD DESC;
GO

В. Использование TOP для ограничения количества обновленных строк

В следующем примере используется предложение TOP для обновления строк в таблице. При использовании предложения TOP (<n>) с UPDATEоперация обновления выполняется в неопределенном количестве строк. То есть оператор UPDATE выбирает любое (n) количество строк, которые соответствуют критериям, определенным в предложении WHERE. В следующем примере 10 случайно выбранных заказчиков переназначаются от одного менеджера по продажам к другому.

USE AdventureWorks2022;

UPDATE TOP (10)
Sales.Store
SET SalesPersonID = 276
WHERE SalesPersonID = 275;
GO

Если необходимо использовать TOP для применения обновлений в понятной хронологии, необходимо использовать TOP вместе с ORDER BY в инструкции subselect. В следующем примере изменяется длительность отпуска для 10 сотрудников, имеющих наибольший стаж работы.

UPDATE HumanResources.Employee
SET VacationHours = VacationHours + 8
FROM (SELECT TOP 10 BusinessEntityID
      FROM HumanResources.Employee
      ORDER BY HireDate ASC) AS th
WHERE HumanResources.Employee.BusinessEntityID = th.BusinessEntityID;
GO

Примеры: Azure Synapse Analytics и система платформы аналитики (PDW)

В приведенном ниже примере возвращаются первые строки (31), соответствующие условию запроса. Предложение ORDER BY гарантирует, что 31 возвращаемых строк являются первыми 31 строками на основе алфавитного порядка столбца LastName.

Использование TOP без указания связей.

SELECT TOP (31) FirstName, LastName
FROM DimEmployee
ORDER BY LastName;

Результат: возвращается 31 строка.

Использование TOP, указание WITH TIES.

SELECT TOP (31) WITH TIES FirstName, LastName
FROM DimEmployee
ORDER BY LastName;

Результат: возвращаются 33 строки, так как три сотрудника с именем Brown галстук для 31-й строки.