Compartir a través de


TOP (Transact-SQL)

Se aplica a:SQL ServerAzure SQL DatabaseAzure SQL Managed InstanceAzure Synapse AnalyticsAnalytics Platform System (PDW)Punto de conexión de análisis SQL en Microsoft FabricWarehouse en Microsoft FabricBase de datos SQL de Microsoft Fabric

Limita las filas devueltas en un conjunto de resultados de la consulta a un número o porcentaje de filas especificado en SQL Server. Cuando se usa TOP con la cláusula ORDER BY, el conjunto de resultados se limita al primer n número de filas ordenadas. De lo contrario, TOP devuelve el primer n número de filas en un orden indefinido. Use esta cláusula para especificar el número de filas devueltas desde una instrucción SELECT. O bien, use TOP para especificar las filas afectadas por una instrucción INSERT, UPDATE, MERGEo DELETE.

Convenciones de sintaxis de Transact-SQL

Sintaxis

Sintaxis para SQL Server y Azure SQL Database:

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

Sintaxis de Azure Synapse Analytics and Analytics Platform System (PDW):

[
    TOP ( expression )
    [ WITH TIES ]
]

Argumentos

expression

La expresión numérica que especifica el número de filas que se van a devolver. expresión se convierte implícitamente en un valor de float si especifica . De lo contrario, expression se convierte en bigint.

PERCENT

Indica que la consulta devuelve solo el primer porcentaje de filas de expression del conjunto de resultados. Los valores fraccionarios se redondean al siguiente valor entero.

WITH TIES

Devuelve dos o más filas que ocupan el último lugar en el conjunto de resultados limitado. Debe usar este argumento con la cláusula ORDER BY. WITH TIES puede provocar que se devuelvan más filas que el valor especificado en expresión. Por ejemplo, si expresión se establece en 5 pero dos filas más coinciden con los valores de las columnas de ORDER BY de la fila 5, el conjunto de resultados contiene siete filas.

Puede especificar la cláusula TOP con el argumento WITH TIES solo en instrucciones SELECT y solo si también especifica la cláusula ORDER BY. El orden devuelto de los registros enlazados es arbitrario. ORDER BY no afecta a esta regla.

Procedimientos recomendados

En una instrucción SELECT, use siempre una cláusula ORDER BY con la cláusula TOP. Esta es la única manera de indicar de forma predecible qué filas se ven afectadas por TOP.

Use OFFSET y FETCH en la cláusula ORDER BY en lugar de la cláusula TOP para implementar una solución de paginación de consultas. Una solución de paginación (es decir, enviar fragmentos o páginas de de datos al cliente) es más fácil de implementar mediante OFFSET y cláusulas FETCH. Para obtener más información, vea cláusula SELECT - ORDER BY.

Use TOP (o OFFSET y FETCH) en lugar de SET ROWCOUNT para limitar el número de filas devueltas. Estos métodos se prefieren sobre el uso de SET ROWCOUNT por los siguientes motivos:

  • Como parte de una instrucción SELECT, el optimizador de consultas puede considerar el valor de expresión en las cláusulas TOP o FETCH durante la optimización de consultas. Dado que usa SET ROWCOUNT fuera de una instrucción que ejecuta una consulta, su valor no se puede considerar en un plan de consulta.

Compatibilidad con compatibilidad

Para la compatibilidad con versiones anteriores, los paréntesis son opcionales en SELECT instrucciones si la expresión es una constante entera. Se recomienda usar siempre paréntesis para TOP en instrucciones SELECT. Al hacerlo, se proporciona coherencia con su uso necesario en INSERTinstrucciones , UPDATE, MERGEy DELETE .

Interoperabilidad

La expresión TOP no afecta a las instrucciones que se pueden ejecutar debido a un desencadenador. Las tablas inserted y deleted de los desencadenadores solo devuelven las filas que realmente se ven afectadas por las instrucciones INSERT, UPDATE, MERGEo DELETE. Por ejemplo, si se desencadena un INSERT TRIGGER como resultado de una instrucción INSERT que usó una cláusula TOP.

SQL Server permite actualizar las filas a través de las vistas. Dado que puede incluir la cláusula TOP en la definición de vista, ciertas filas pueden desaparecer de la vista si las filas ya no cumplen los requisitos de la expresión de TOP debido a una actualización.

Cuando se especifica en la instrucción MERGE, la cláusula TOP se aplica después de toda la tabla de origen y se combinan toda la tabla de destino. Además, se quitan las filas combinadas que no cumplen los requisitos para una acción de inserción, actualización o eliminación. La cláusula TOP reduce aún más el número de filas combinadas al valor especificado y las acciones de inserción, actualización o eliminación se aplican a las filas combinadas restantes de forma no ordenada. Es decir, no hay ningún orden en el que las filas se distribuyen entre las acciones definidas en las cláusulas WHEN. Por ejemplo, si especificar TOP (10) afecta a 10 filas, se pueden actualizar siete de estas filas y tres insertadas. O bien, se puede eliminar uno, cinco actualizados y cuatro insertados, etc. Dado que la instrucción MERGE realiza un examen de tabla completa de las tablas de origen y de destino, el rendimiento de E/S puede verse afectado cuando se usa la cláusula TOP para modificar una tabla grande mediante la creación de varios lotes. En este escenario, es importante asegurarse de que todos los lotes sucesivos tengan como destino nuevas filas.

Tenga cuidado al especificar la cláusula TOP en una consulta que contiene un operador de UNION, UNION ALL, EXCEPTo INTERSECT. Es posible escribir una consulta que devuelva resultados inesperados porque el orden en el que las cláusulas TOP y ORDER BY se procesan lógicamente no siempre es intuitiva cuando estos operadores se usan en una operación de selección. Por ejemplo, dados los siguientes datos y la siguiente tabla, suponga que desea devolver el coche rojo menos caro y el coche azul menos caro. Es decir, el sedán rojo y la camioneta azul.

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');

Para lograr estos resultados, podría escribir la siguiente consulta.

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

Este es el conjunto de resultados.

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

Los resultados inesperados se devuelven porque la cláusula TOP se ejecuta lógicamente antes de la cláusula ORDER BY, que ordena los resultados del operador (UNION ALL en este caso). Así, la consulta anterior devuelve cualquier coche rojo y cualquier coche azul y, a continuación, ordena el resultado de esa unión por el precio. En el siguiente ejemplo se muestra el método correcto de escribir esta consulta para lograr el resultado deseado.

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

Al usar TOP y ORDER BY en una operación de subselección, asegúrese de que los resultados de la cláusula ORDER BY se aplican a la cláusula TOP y no a ordenar el resultado de la operación de UNION.

Este es el conjunto de resultados.

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

Limitaciones

Cuando se usa TOP con INSERT, UPDATE, MERGEo DELETE, las filas a las que se hace referencia no se organizan en ningún orden. Además, no se puede especificar directamente la cláusula ORDER BY en estas instrucciones. Si necesita usar TOP para insertar, eliminar o modificar filas en un orden cronológico significativo, use TOP con una cláusula ORDER BY especificada en una instrucción subselect. Consulte la sección ejemplos de de este artículo.

No puede usar TOP en instrucciones UPDATE o DELETE en vistas con particiones.

No puede combinar TOP con OFFSET y FETCH en la misma expresión de consulta (en el mismo ámbito de consulta). Para obtener más información, vea cláusula SELECT - ORDER BY.

Ejemplos

Los ejemplos de código de Transact-SQL de este artículo usan la base de datos de ejemplo de AdventureWorks2022 o AdventureWorksDW2022, que puede descargar de la página principal ejemplos de Microsoft SQL Server y proyectos de comunidad.

Category Elementos de sintaxis ofrecidos
Sintaxis básica TOP * PERCENT
Incluir valores equivalentes WITH TIES
Limitar las filas afectadas por DELETE, INSERT o UPDATE DELETE, INSERT, UPDATE

Sintaxis básica

En los ejemplos de esta sección se muestra la funcionalidad básica de la cláusula ORDER BY mediante la sintaxis mínima necesaria.

A. Uso de TOP con un valor constante

En los siguientes ejemplos se utiliza un valor constante para especificar el número de empleados que se devuelven en el conjunto de resultados de la consulta. En el primer ejemplo, se devuelven las primeras 10 filas sin definir porque no se usa una cláusula ORDER BY. En el segundo ejemplo, se usa una cláusula ORDER BY para devolver los 10 empleados contratados más recientemente.

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. Uso de TOP con una variable

En el siguiente ejemplo se utiliza una variable para especificar el número de empleados que se devuelven en el conjunto de resultados de la consulta.

USE AdventureWorks2022;
GO

DECLARE @p AS INT = 10;

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

C. Especificar un porcentaje

En el ejemplo siguiente se usa PERCENT para especificar el número de empleados que se devuelven en el conjunto de resultados de la consulta. Hay 290 empleados en la tabla HumanResources.Employee. Dado que el cinco por ciento de 290 es un valor fraccionario, el valor se redondea al número entero siguiente.

USE AdventureWorks2022;
GO

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

Incluir valores de vinculación

A. Use WITH TIES para incluir filas que coincidan con los valores de la última fila.

En el ejemplo siguiente se obtiene el primer 10 por ciento de los empleados que tienen los salarios más altos y se devuelven en orden descendente de acuerdo con su salario. La especificación de WITH TIES garantiza que también se incluyan en el conjunto de resultados los empleados con salarios iguales al salario más bajo devuelto (la última fila), aun cuando esto exceda el 10 por ciento de los empleados.

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

Limitar las filas afectadas por DELETE, INSERT o UPDATE

A. Usar TOP para limitar el número de filas eliminadas

Cuando se usa una cláusula TOP (<n>) con DELETE, la operación de eliminación se realiza en una selección no definida de n número de filas. Es decir, la instrucción DELETE elige cualquier (n) número de filas que cumplan los criterios definidos en la cláusula WHERE. En el ejemplo siguiente se eliminan 20 filas de la tabla PurchaseOrderDetail cuyas fechas de vencimiento son anteriores al 1 de julio de 2002.

USE AdventureWorks2022;
GO

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

Si desea usar TOP para eliminar filas en un orden cronológico significativo, use TOP con ORDER BY en una instrucción de subselección. La siguiente consulta elimina de la tabla PurchaseOrderDetail las 10 filas con las fechas de vencimiento más antiguas. Para garantizar que solo se eliminen 10 filas, la columna especificada en la instrucción de subselección (PurchaseOrderID) es la clave principal de la tabla. El uso de una columna que no sea clave en la instrucción subselect podría provocar la eliminación de más de 10 filas si la columna especificada contiene valores duplicados.

USE AdventureWorks2022;
GO

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

B. Usar TOP para limitar el número de filas insertadas

En el siguiente ejemplo se crea la tabla EmployeeSales y se insertan el nombre y los datos de ventas del año hasta la fecha para los primeros cinco empleados de la tabla HumanResources.Employee. La instrucción INSERT elige las cinco filas devueltas por la instrucción SELECT que cumplen los criterios definidos en la cláusula WHERE. La cláusula OUTPUT muestra las filas que se insertan en la tabla EmployeeSales. La cláusula ORDER BY de la instrucción SELECT no se usa para determinar los cinco empleados principales.

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

Si desea usar TOP para insertar filas en un orden cronológico significativo, use TOP con ORDER BY en una instrucción de subselección. En el ejemplo siguiente se muestra cómo hacerlo. La cláusula OUTPUT muestra las filas que se insertan en la tabla EmployeeSales. Los cinco empleados principales ahora se insertan en función de los resultados de la cláusula ORDER BY en lugar de filas no definidas.

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

C. Usar TOP para limitar el número de filas actualizadas

En el ejemplo siguiente se usa la cláusula TOP para actualizar las filas de una tabla. Cuando se usa una cláusula TOP (<n>) con UPDATE, la operación de actualización se ejecuta en un número indefinido de filas. Es decir, la instrucción UPDATE elige cualquier (n) número de filas que cumplan los criterios definidos en la cláusula WHERE. En el ejemplo siguiente se asignan 10 clientes de un vendedor a otro.

USE AdventureWorks2022;

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

Si tiene que usar TOP para aplicar actualizaciones en una cronología significativa, debe usar TOP junto con ORDER BY en una instrucción de subselección. En el siguiente ejemplo se actualizan las horas de vacaciones de los 10 empleados cuyas fechas de alta son más antiguas.

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

Ejemplos: Azure Synapse Analytics y Sistema de la plataforma de análisis (PDW)

En el ejemplo siguiente se devuelven las primeras 31 filas que coinciden con los criterios de búsqueda. La cláusula ORDER BY garantiza que las 31 filas devueltas son las primeras 31 filas basadas en una ordenación alfabética de la columna LastName.

Usar TOP sin especificar vínculos.

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

Resultado: se devuelven 31 filas.

Con TOP, especificando WITH TIES.

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

Resultado: se devuelven 33 filas, ya que tres empleados denominados Brown empate para la fila 31.