2008-11-12 10 views
9

Algunas bases de datos compatibles con comandos como:¿Hay un equivalente 'START AT' en MS-SQL?

SELECT TOP 10 START AT 10 * FROM <TABLE> 

Esencialmente tengo que tirar de los primeros 10 registros, a continuación, los próximos 10, entonces el siguiente 10, etc. Tal vez hay otra manera de hacer esto, pero en el pasado Lo he hecho como el anterior para las bases de datos que soportan 'START AT'.

+0

Tengo curiosidad, ¿qué bases de datos distintas de Sybase SQL Anywhere soporta la cláusula 'START AT'? –

Respuesta

5

¿Qué versión de SQL Server?

En SQL Server 2000 esto es un verdadero dolor (aunque es posible usar trucos feos como el publicado por stingyjack).

En 2005 y después es un poco más fácil: consulte la función Row_Number().

Y, dependiendo de la aplicación del cliente, puede que ni siquiera sea tan difícil. Algunos de los controles de red ASP.Net tienen soporte para paginación automática.

4
SELECT Top 10 * 
FROM Table 
WHERE <primary key> Not IN (
    SELECT Top 10 <primaryKey> 
    FROM Table 
    ORDER BY <primary Key> ASC) 
ORDER BY <primary Key> ASC 
4

Si quieres ser compatible con SQL Server 2000 podría utilizar

SELECT * FROM 
(
    SELECT TOP 10 FROM 
    (
     SELECT TOP (n * 10) FROM <table> ORDER BY (column) ASC 
    ) AS t1 ORDER BY (column) DESC 
) AS t2 ORDER BY (column) ASC 

En SQL Server 2005 hay una nueva función ROW_NUMBER(). Se podría utilizar de esta manera:

WITH Orders AS 
(
    SELECT SalesOrderID, OrderDate, 
    ROW_NUMBER() OVER (order by OrderDate) AS 'RowNumber' 
    FROM SalesOrder 
) 
SELECT * 
FROM Orders 
WHERE RowNumber between 10 and 19; 
5

Para SQL Server 2012

SELECT * 
FROM <TABLE> 
ORDER BY <SomeCol> 
OFFSET 10 ROWS 
FETCH NEXT 10 ROWS ONLY; 
+0

¡Es bueno ver que SQL Server finalmente agrega algún tipo de especificación de un 'OFFSET'! Esta sintaxis parece compatible con DB2, Derby e Ingres ... –

+0

@LukasEder - Es el estándar SQL: 2008 [AFAIK] (http://troels.arvin.dk/db/rdbms/#select-limit-offset) –

+0

Hmm, el [último borrador de SQL: 2008 que he visto] (http://www.wiscorp.com/sql200n.zip) no menciona dicha extensión a ' '(página 837 en 5CD2-02 -Fundación-2006-01.pdf). Pero eso es solo un borrador, así que tal vez en el último documento SQL: 2008, pueden haber agregado esa cláusula ...? Los comentarios solo se pueden editar durante 5 minutos (haga clic en este cuadro para cerrar) –