Estoy tratando de hacer algo como:
SELECT * FROM table LIMIT 10,20
o
SELECT * FROM table LIMIT 10 OFFSET 10
pero usando SQL Server
La única solución que encontré parece exagerada:
SELECT * FROM (
SELECT *, ROW_NUMBER() OVER (ORDER BY name) as row FROM sys.databases
) a WHERE row > 5 and row <= 10
También encontré :
SELECT TOP 10 * FROM stuff;
... pero no es lo que quiero hacer, ya que no puedo especificar el límite inicial.
¿Hay otra forma de hacer eso?
Además, por curiosidad, ¿hay alguna razón por la que SQL Server no admite la LIMIT
función o algo similar? No quiero ser malo, pero eso realmente suena como algo que un DBMS necesita ... Si lo hace, ¡lo siento por ser tan ignorante! He estado trabajando con MySQL y SQL + durante los últimos 5 años, así que ...
sql
sql-server
pagination
limit
marcgg
fuente
fuente
ROW_NUMBER()
y limitarTOP
el ancho del rango y unaWHERE
condición para un límite del rango. También he notado un rendimiento mucho mejor si laTOP
cláusula usa un literal en lugar de una variableRespuestas:
La
LIMIT
cláusula no es parte del SQL estándar. MySQL, PostgreSQL y SQLite lo admiten como una extensión de proveedor para SQL.Otras marcas de bases de datos pueden tener características similares (por ejemplo,
TOP
en Microsoft SQL Server), pero estas no siempre funcionan de manera idéntica.Es difícil de usar
TOP
en Microsoft SQL Server para imitar laLIMIT
cláusula. Hay casos en los que simplemente no funciona.La solución que mostró,
ROW_NUMBER()
está disponible en Microsoft SQL Server 2005 y versiones posteriores. Esta es la mejor solución (por ahora) que funciona únicamente como parte de la consulta.Otra solución es usar
TOP
para buscar las primeras filas de recuento + desplazamiento , y luego usar la API para buscar más allá de las primeras filas de desplazamiento .Ver también:
fuente
Para SQL Server 2012 + puede usar .
fuente
offset
, o puede dejar esa línea fuera (suponiendo que no desea un desplazamiento)?OFFSET 0 ROWS
Parse error at line: 4, column: 1: Incorrect syntax near 'OFFSET'
como encontraste, este es el método de servidor sql preferido:
fuente
a
después de la selección interna? Supongo que le estás dando un alias a la selección interna, pero parece que nunca la usas ... ¿Deberías hacerlo ena.row
lugar de solorow
?( )
tabla derivada, pero lo dejará ir si luego olvida usarlo para referirse a las columnas. Aunque lo arreglé ...Si está utilizando SQL Server 2012+, vote por la respuesta de Martin Smith y use las extensiones
OFFSET
yFETCH NEXT
paraORDER BY
,Si tiene la mala suerte de estar atascado con una versión anterior, podría hacer algo como esto,
Creo que es funcionalmente equivalente a
y la mejor manera que sé de hacerlo en TSQL, antes de MS SQL 2012.
Si hay muchas filas, puede obtener un mejor rendimiento utilizando una tabla temporal en lugar de un CTE.
fuente
Desafortunadamente,
ROW_NUMBER()
es lo mejor que puedes hacer. En realidad, es más correcto, porque los resultados de unalimit
otop
cláusula realmente no tienen significado sin tener en cuenta un orden específico. Pero todavía es un dolor que hacer.Actualización: Sql Server 2012 agrega una
limit
característica similar a través de las palabras clave OFFSET y FETCH . Este es el enfoque ansi-estándar, en oposición aLIMIT
, que es una extensión MySql no estándar.fuente
¿Qué tal esto?
Te da las últimas 10 filas de las primeras 20 filas. Un inconveniente es que el orden se invierte, pero, al menos, es fácil de recordar.
fuente
Debe dar registros 11-20. Probablemente no sea demasiado eficiente si se incrementa para obtener más páginas, y no está seguro de cómo podría verse afectado por los pedidos. Puede que tenga que especificar esto en ambas declaraciones WHERE.
fuente
Una buena manera es crear un procedimiento:
al igual que el límite 0,2 /////////////// ejecutar paginación 0,4
fuente
Solo para la solución de registro que funciona en la mayoría de los motores de bases de datos, aunque podría no ser la más eficiente:
Nota de Pelase: la última página todavía contendría filas ReturnCount sin importar qué es SkipCount. Pero eso podría ser algo bueno en muchos casos.
fuente
El equivalente de LIMIT es SET ROWCOUNT, pero si desea una paginación genérica, es mejor escribir una consulta como esta:
fuente
Imprimirá filas de 10 a 15.
fuente
Hasta ahora, este formato es lo que funciona para mí (aunque no es el mejor rendimiento):
Una nota al margen, paginar sobre datos dinámicos puede conducir a resultados extraños / inesperados.
fuente
De la documentación en línea de MS SQL Server ( http://technet.microsoft.com/en-us/library/ms186734.aspx ), aquí está su ejemplo que he probado y funciona, para recuperar un conjunto específico de filas. ROW_NUMBER requiere un OVER, pero puede ordenar por lo que quiera:
fuente
Use todos los servidores SQL:; con tbl como (SELECT ROW_NUMBER () over (ordenar por (seleccione 1)) como RowIndex, * de la tabla) seleccione top 10 * de tbl donde RowIndex> = 10
fuente
imprimirá de 15 a 25 como límite en MYSQl
fuente