94 votos

LÍMITE 10..20 en sqlserver

Estoy tratando de hacer algo como :

SELECT * FROM table LIMIT 10,20

o

SELECT * FROM table LIMIT 10 OFFSET 10

pero el uso de SQLServer

La única solución que he encontrado parece una exageración:

SELECT * FROM ( 
  SELECT *, ROW_NUMBER() OVER (ORDER BY name) as row FROM sys.databases 
 ) a WHERE row > 5 and row <= 10

También he encontrado:

SELECT TOP 10 * FROM stuff;

... pero no es lo que yo quiero hacer, ya no puedo especificar la partida límite.

Hay otra manera para mí para hacer eso ?

Además, sólo por curiosidad, ¿hay una razón por la que no MSserver de apoyo a la función de LÍMITE o algo similar? No quiero ser cruel, pero lo que realmente suena como algo que un DBMS necesidades ... Si lo hace, entonces lo siento por ser tan ignorante! He estado trabajando con MySQL y SQL+ para los últimos 5 años, por lo...

66voto

Martin Smith Puntos 174101

Para SQL Server 2012 + se puede utilizar.

SELECT  *
FROM     sys.databases
ORDER BY name 
OFFSET  5 ROWS 
FETCH NEXT 5 ROWS ONLY 

59voto

Bill Karwin Puntos 204877

La LIMIT cláusula no es parte del estándar SQL. Es admitido como un proveedor de extensión de SQL en MySQL, PostgreSQL y SQLite.

Otras marcas de la base de datos puede tener características similares (por ejemplo, TOP en Microsoft SQL Server), pero estos no siempre funcionan de forma idéntica.

Es difícil usar TOP en Microsoft SQL Server para imitar la LIMIT cláusula. Hay casos en que simplemente no funciona.

La solución que demostró, utilizando ROW_NUMBER() es disponible en Microsoft SQL Server 2005 y versiones posteriores. Esta es la mejor solución (por ahora) que funciona exclusivamente como parte de la consulta.

Otra solución es utilizar TOP para recuperar el primer recuento de + desplazamiento de filas y, a continuación, utilizar la API para buscar más allá de la primera desplazamiento de filas.

Ver también:

23voto

KM. Puntos 51800

como estaba, este es el método de servidor sql preferida:

SELECT * FROM ( 
  SELECT *, ROW_NUMBER() OVER (ORDER BY name) as row FROM sys.databases 
 ) a WHERE a.row > 5 and a.row <= 10

6voto

Joel Coehoorn Puntos 190579

Desafortunadamente, la ROW_NUMBER() es lo mejor que puedes hacer. Es más correcto, porque los resultados de un limit o top cláusula no tienen realmente significado retro-americano un orden específico. Pero todavía es un dolor que hacer.

Actualización: Sql Server 2012 añade un limit -como característica mediante palabras clave OFFSET y FETCH.

5voto

David Patrick Puntos 59

¿Y esto?

SET ROWCOUNT 10 

SELECT TOP 20 *
FROM sys.databases
ORDER BY database_id DESC

Te da las últimas 10 filas de las primeras 20 filas. Una desventaja es que el orden se invierte, pero al menos es fácil de recordar.

Iteramos.com

Iteramos es una comunidad de desarrolladores que busca expandir el conocimiento de la programación mas allá del inglés.
Tenemos una gran cantidad de contenido, y también puedes hacer tus propias preguntas o resolver las de los demás.

Powered by:

X