- 16/03/2017
- 11 minutos de lectura
-
- V
- M
- r
- c
- d
-
+12
Se aplica a: SQL Server (todas las versiones compatibles) Azure SQL Database Azure SQL Managed Instance Azure Synapse Analytics Almacenamiento de datos en paralelo
Limita las filas devueltas en un conjunto de resultados de consulta a un número específico de filas o porcentaje de filas en SQL Server. Cuando usa TOP con la cláusula ORDER BY, el conjunto de resultados se limita al primer número N de filas ordenadas. De lo contrario, TOP devuelve el primer número N de filas en un orden indefinido. Utilice esta cláusula para especificar el número de filas devueltas de una instrucción SELECT. O use TOP para especificar las filas afectadas por una instrucción INSERT, UPDATE, MERGE o DELETE.
Convenciones de sintaxis Transact-SQL
Sintaxis
A continuación se muestra la sintaxis de SQL Server y Azure SQL Database:
A continuación se muestra la sintaxis de Azure Synapse Analytics y Parallel Almacén de datos:
Nota
Para ver la sintaxis de Transact-SQL para SQL Server 2014 y versiones anteriores, consulte la documentación de versiones anteriores .
Argumentos
expresión
La expresión numérica que especifica el número de filas que se devolverán. expresión se convierte implícitamente en un valor flotante si especifica PERCENT. De lo contrario, la expresión se convierte a bigint.
PERCENT
Indica que la consulta devuelve solo el primer porcentaje de expresión de filas del conjunto de resultados. Los valores fraccionarios se redondean al siguiente valor entero.
WITH TIES
Devuelve dos o más filas que empatan en el último lugar en el conjunto de resultados limitado. Debe utilizar este argumento con la cláusula ORDER BY. WITH TIES puede hacer que se devuelvan más filas que el valor especificado en expresión. Por ejemplo, si la expresión se establece en 5 pero dos filas adicionales coinciden con los valores de las columnas ORDER BY en la fila 5, el conjunto de resultados contendrá siete filas.
Puede especificar la cláusula TOP con WITH TIES argumento solo en declaraciones SELECT, y solo si también ha especificado la cláusula ORDER BY. El orden devuelto de los registros vinculados es arbitrario. ORDER BY no afecta esta regla.
Mejores prácticas
En una instrucción SELECT, use siempre una cláusula ORDER BY con la cláusula TOP. Porque es la única forma de indicar de manera 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 datos al cliente) es más fácil de implementar mediante las cláusulas OFFSET y FETCH. Para obtener más información, consulte la cláusula ORDER BY (Transact-SQL).
Use TOP (o OFFSET y FETCH) en lugar de SET ROWCOUNT para limitar el número de filas devueltas. Estos métodos son preferibles al uso de SET ROWCOUNT por las siguientes razones:
- Como parte de una instrucción SELECT, el optimizador de consultas puede considerar el valor de la expresión en las cláusulas TOP o FETCH durante la optimización de la consulta. Debido a que usa SET ROWCOUNT fuera de una declaración que ejecuta una consulta, su valor no se puede considerar en un plan de consulta.
Soporte de compatibilidad
Para compatibilidad con versiones anteriores, los paréntesis son opcionales en las declaraciones SELECT si la expresión es una constante entera hormiga. Recomendamos que utilice siempre paréntesis para TOP en las sentencias SELECT. Si lo hace, proporciona coherencia con su uso requerido en las instrucciones INSERT, UPDATE, MERGE y DELETE.
Interoperabilidad
La expresión TOP no afecta las declaraciones que podrían ejecutarse debido a un disparador. Las tablas insertadas y eliminadas en los desencadenadores devuelven solo las filas que se ven realmente afectadas por las declaraciones INSERT, UPDATE, MERGE o DELETE. Por ejemplo, si un INSERT TRIGGER se activa como resultado de una instrucción INSERT que utilizó una cláusula TOP.
SQL Server permite actualizar filas a través de vistas. Debido a que puede incluir la cláusula TOP en la definición de la vista, ciertas filas pueden desaparecer de la vista si las filas ya no cumplen con los requisitos de la expresión TOP debido a una actualización .
Cuando se especifica en la declaración MERGE, la cláusula TOP se aplica después de que se unen toda la tabla de origen y toda la tabla de destino. Y las filas unidas que no califican para una inserción, actualización o eliminación acción se eliminan. La cláusula TOP reduce aún más el número de filas unidas al valor especificado y las acciones de inserción, actualización o eliminación se aplican a las filas unidas restantes de forma desordenada. Es decir, no hay ningún orden en el que las filas se distribuyan entre las acciones definidas en las cláusulas WHEN.Por ejemplo, si especificar TOP (10) afecta a 10 filas, de estas filas, siete pueden actualizarse y tres insertarse. O se puede eliminar uno, actualizar cinco, insertar cuatro, y así sucesivamente. Debido a que la instrucción MERGE realiza un escaneo completo de la tabla de origen y de destino, el rendimiento de E / S puede verse afectado cuando usa la cláusula TOP para modificar una tabla grande creando varios lotes. En este escenario, es importante asegurarse de que todos los lotes sucesivos se dirijan a nuevas filas.
Tenga cuidado al especificar la cláusula TOP en una consulta que contenga UNION, UNION ALL, EXCEPT o INTERSECT operador. 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 intuitivo cuando estos operadores se utilizan en una operación de selección. Por ejemplo, con la siguiente tabla y datos, suponga que desea devolver el automóvil rojo menos costoso y el automóvil azul menos costoso. Es decir, el sedán rojo y la camioneta azul.
Para lograr estos resultados, puede escribir la siguiente consulta.
A continuación se muestra el conjunto de resultados.
Los resultados inesperados se devuelven porque la cláusula TOP se ejecuta lógicamente antes que la cláusula ORDER BY, que ordena los resultados del operador (UNION ALL en este caso). Entonces, la consulta anterior devuelve cualquier automóvil rojo y cualquier automóvil azul y luego ordena el resultado de esa unión por el precio. El siguiente ejemplo muestra el método correcto de escribir esta consulta para lograr el resultado deseado.
Al usar TOP y ORDER BY en una operación de subselección, se asegura de que los resultados de la cláusula ORDER BY se apliquen al TOP cláusula y no ordenar el resultado de la operación UNION.
Aquí está el conjunto de resultados.
Limitaciones y restricciones
Cuando usa TOP con INSERT, UPDATE, MERGE o DELETE, las filas referenciadas no están dispuestas en ningún orden. Y no puede especificar directamente la cláusula ORDER BY en estas declaraciones. 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 declaración de subselección. Vea la siguiente sección de Ejemplos en este artículo.
No puede usar TOP en una instrucción UPDATE y DELETE en vistas particionadas.
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, consulte la cláusula ORDER BY (Transact-SQL).
Ejemplos
Categoría | Elementos de sintaxis destacados |
---|---|
Sintaxis básica | TOP • PERCENT |
Incluyendo valores de empate | WITH TIES |
Limitar las filas afectadas por ELIMINAR, INSERTAR o ACTUALIZAR | ELIMINAR • INSERTAR • ACTUALIZAR |
Sintaxis básica
Los ejemplos de esta sección demuestran la funcionalidad básica de la cláusula ORDER BY utilizando la sintaxis mínima requerida.
UNA. Usar TOP con un valor constante
Los siguientes ejemplos usan 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, las primeras 10 filas no definidas se devuelven 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 más contratados recientemente.
B. Usando TOP con una variable
El siguiente ejemplo usa una variable para especificar el número de empleados que se devuelven en el conjunto de resultados de la consulta.
C. Especificación de un porcentaje
El siguiente ejemplo 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
. Como el cinco por ciento de 290 es un valor fraccionario, el valor se redondea al siguiente número entero.
Incluyendo valores de empate
A. Usar WITH TIES para incluir filas que coincidan con los valores de la última fila
El siguiente ejemplo obtiene el 10
por ciento de todos los empleados con el salario más alto nd las devuelve en orden descendente según su salario. Especificar WITH TIES
asegura que los empleados con salarios iguales al salario más bajo devuelto (la última fila) también se incluyan en el conjunto de resultados, incluso si excede 10
porcentaje de empleados.
Limitando las filas afectadas por DELETE, INSERT o UPDATE
A. Uso de TOP para limitar el número de filas eliminadas
Cuando usa una cláusula TOP (n) con DELETE, la operación de eliminación se realiza en una selección indefinida de n números 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.El siguiente ejemplo elimina 20
filas de la tabla PurchaseOrderDetail
que tienen fechas de vencimiento anteriores al 1 de julio de 2002.
Si desea usar TOP para eliminar filas en un orden cronológico significativo, use TOP con ORDER BY en una declaración de subselección. La siguiente consulta elimina las 10 filas de la tabla PurchaseOrderDetail
que tienen las fechas de vencimiento más antiguas. Para asegurarse de 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 sin clave en la instrucción de subselección puede resultar en la eliminación de más de 10 filas si la columna especificada contiene valores duplicados.
B. Usar TOP para limitar el número de filas insertadas
El siguiente ejemplo crea la tabla EmployeeSales
e inserta el nombre y los datos de ventas hasta la fecha de los cinco primeros empleados de la tabla HumanResources.Employee
. La instrucción INSERT elige 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
. Observe que la cláusula ORDER BY en la declaración SELECT no se usa para determinar los cinco empleados principales.
Si desea usar TOP para insertar filas en un orden cronológico significativo, use TOP con ORDER BY en un subselección. El siguiente ejemplo muestra cómo hacer esto. La cláusula OUTPUT muestra las filas que se insertan en la tabla EmployeeSales
. Observe que 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.
C. Usar TOP para limitar el número de filas actualizadas
El siguiente ejemplo usa la cláusula TOP para actualizar filas en una tabla. Cuando 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. El siguiente ejemplo asigna 10 clientes de un vendedor a otro.
Si tiene que use TOP para aplicar actualizaciones en una cronología significativa, debe usar TOP junto con ORDER BY en una declaración de subselección. El siguiente ejemplo actualiza las horas de vacaciones de los 10 empleados con las fechas de contratación más tempranas.
Ejemplos: Azure Synapse Analytics y Parallel Data Warehouse
El siguiente ejemplo devuelve las 31 filas superiores que coinciden con los criterios de consulta. La cláusula ORDER BY asegura que las 31 filas devueltas son las primeras 31 filas según un orden alfabético de la columna LastName
.
Usando TOP sin especificar vínculos.
Resultado: se devuelven 31 filas.
Usando TOP, especificando WITH TIES.
Resultado: se devuelven 33 filas, porque tres empleados nombraron Brown tie para la fila 31.