2010-07-10 37 views
8

Estoy utilizando SQL Server 2008 Enterprise en Windows Server 2008. Quiero seleccionar el resultado del top 11 al top 20 (por ejemplo, estoy interesado únicamente en el resultado del 11º al 20º). ¿Alguna idea de cómo escribir esta consulta en tsql de manera eficiente?SQL Server OFFSET equivalente

gracias de antemano, George

+0

SQL Server OFFSET equivalente presente 2012 en adelante. Ver [mi solución] (http://stackoverflow.com/a/9261797/1045444). –

Respuesta

17

Desafortunadamente SQL Server no ofrece nada similar a MySQL de OFFSET sintaxis. Sin embargo, es posible que desee probar el uso de una tabla derivada de la siguiente manera:

SELECT some_field 
FROM (
      SELECT some_field, ROW_NUMBER() OVER (ORDER BY some_id) AS rownum 
      FROM table 
     ) AS t 
WHERE t.rownum BETWEEN 11 AND 20 
+0

¿Debo hacer un pedido por algún_id? – George2

+2

@ George2: como las tablas en las bases de datos relacionales son solo conjuntos de registros desordenados, debe ordenar el conjunto de resultados por una (o más) columna (s) única (s) para que la paginación tenga sentido. De lo contrario, ¿cómo se puede decir que un registro es el undécimo? –

+0

Genial, ¡pregunta respondida! – George2

2

Suponiendo una PK campo de clasificación,

select top 10 * from MyTable 
where PK not in (select top 10 PK from Mytable order by PK) 
order by PK 

Editar: esta es una variante

select top 10 * from 
(select top 20 * from MyTable order by PK) as MySelection 
order by PK desc 
+0

Creo que es muy complicado, ya que cuando tengo que seleccionar el 21º al 30º, necesito escribir otro enunciado tsql. – George2

+1

Es bastante fácil parametrizar la consulta. – SeaDrive

+0

Esto parece una buena solución. es escalable? Es decir. ¿Habrá algún problema de rendimiento si el 'MyTable' tiene 500,000 filas y a veces quiere filas de 400,000 a 400,010? – hofnarwillie

5

Ver siguiente solución sólo es aplicable para SQL Server 2012 en adelante.

límite con desplazamiento en el servidor SQL:

SELECT email FROM myTable 
OFFSET 10 ROWS 
FETCH NEXT 10 ROWS ONLY; 

// desplazamiento - no. de filas omitidas

// siguiente: obligatorio no. de las filas siguientes

+0

La pregunta es 2008 y esa es una función de 2012 – Paparazzi

+0

@Blam: He dado una respuesta porque puede ser útil para las personas que ahora están usando la versión mejorada del servidor sql. ¿Quieres que borre la respuesta si sientes que es un error para las personas? He actualizado la respuesta ahora. –

Cuestiones relacionadas