¿Hay alguna manera en SQL Server para obtener los resultados a partir de un desplazamiento determinado? Por ejemplo, en otro tipo de base de datos SQL, es posible hacer:
SELECT * FROM MyTable OFFSET 50 LIMIT 25
para obtener resultados 51-75. Esta construcción no parece existir en SQL Server.
¿Cómo puedo lograr esto sin cargar todas las filas que no me importan? ¡Gracias!
sql
sql-server
Alex
fuente
fuente
Respuestas:
Evitaría usar
SELECT *
. Especifique las columnas que realmente desea, aunque pueden ser todas ellas.SQL Server 2005+
SQL Server 2000
Paginación eficiente a través de grandes conjuntos de resultados en SQL Server 2000
Un método más eficiente para paginar a través de grandes conjuntos de resultados
fuente
SELECT *
significa que si la estructura de la tabla cambia, su consulta aún se ejecuta, pero da resultados diferentes. Si se agrega una columna, esto podría ser útil (aunque todavía tiene que usarla por su nombre en alguna parte); Si una columna se elimina o cambia de nombre, es mejor que su SQL se rompa visiblemente que el código que se encuentra más abajo comportándose de manera extraña porque una variable no está inicializada.Si va a procesar todas las páginas en orden, simplemente recordar el último valor clave visto en la página anterior y usarlo
TOP (25) ... WHERE Key > @last_key ORDER BY Key
puede ser el mejor método si existen índices adecuados para permitir que esto se busque de manera eficiente, o un cursor API si no .Para seleccionar una página arbitraria, la mejor solución para SQL Server 2005 - 2008 R2 es probablemente
ROW_NUMBER
yBETWEEN
Para SQL Server 2012+, puede usar la cláusula ORDER BY mejorada para esta necesidad.
Aunque queda por ver qué tan bien será el desempeño de esta opción .
fuente
Esta es una forma (SQL2000)
y esta es otra forma (SQL 2005)
fuente
Puede usar la
ROW_NUMBER()
función para obtener lo que desea:fuente
Existe
OFFSET .. FETCH
en SQL Server 2012, pero deberá especificar unaORDER BY
columna.Si realmente no tiene ninguna columna explícita que pueda pasar como
ORDER BY
columna (como lo han sugerido otros), puede usar este truco:... o
Lo usamos en jOOQ cuando los usuarios no especifican explícitamente un pedido. Esto producirá un pedido bastante aleatorio sin ningún costo adicional.
fuente
Para las tablas con más y grandes columnas de datos, prefiero:
-
Tiene un rendimiento mucho mejor en tablas con datos grandes como BLOB, porque la función ROW_NUMBER solo tiene que mirar a través de una columna, y solo las filas coincidentes se devuelven con todas las columnas.
fuente
Ver mi selección para paginador
Esto resuelve la paginación;)
fuente
fuente
Dependiendo de su versión, no puede hacerlo directamente, pero podría hacer algo hacky como
donde 'campo' es la clave.
fuente
A continuación se mostrarán 25 registros, excluyendo los primeros 50 registros que funcionan en SQL Server 2012.
puede reemplazar la identificación como su requisito
fuente
Debe tener cuidado al usar la
ROW_NUMBER() OVER (ORDER BY)
declaración ya que el rendimiento es bastante pobre. Lo mismo ocurre con el uso de expresiones de tabla comunes conROW_NUMBER()
eso es aún peor. Estoy usando el siguiente fragmento que ha demostrado ser un poco más rápido que usar una variable de tabla con una identidad para proporcionar el número de página.fuente
Yo uso esta técnica para la paginación. No busco todas las filas. Por ejemplo, si mi página necesita mostrar las 100 filas superiores, busco solo las 100 con la cláusula where. La salida del SQL debe tener una clave única.
La tabla tiene lo siguiente:
Se asignará el mismo rango para más de un KeyId.
SQL es
select top 2 * from Table1 where Rank >= @Rank and ID > @Id
Por primera vez paso 0 para ambos. La segunda vez pasa 1 y 14. 3ra vez pasa 2 y 6 ...
El valor del décimo registro Rango e Id se pasa al siguiente
Esto tendrá el menor estrés en el sistema
fuente
En SqlServer2005 puede hacer lo siguiente:
fuente
@Offset + @Limit - 1
? Si @Limit es 10, esto devolverá 11 filas.La mejor manera de hacerlo sin perder tiempo para ordenar registros es así:
¡Toma menos de un segundo!
La mejor solución para mesas grandes.
fuente
He estado buscando esta respuesta durante un tiempo (para consultas genéricas) y descubrí otra forma de hacerlo en SQL Server 2000+ usando ROWCOUNT y cursores y sin TOP ni ninguna tabla temporal.
Utilizando la
SET ROWCOUNT [OFFSET+LIMIT]
puede limitar los resultados, y con los cursores, vaya directamente a la fila que desee, luego haga un bucle hasta el final.Entonces su consulta sería así:
fuente
Con SQL Server 2012 (11.x) y posterior y Azure SQL Database, también puede tener "fetch_row_count_expression", también puede tener la cláusula ORDER BY junto con esto.
https://docs.microsoft.com/en-us/sql/t-sql/queries/select-order-by-clause-transact-sql?view=sql-server-ver15
Nota DESPLAZAMIENTO Especifica el número de filas a omitir antes de que comience a devolver filas desde la expresión de consulta. NO es el número de la fila inicial. Entonces, tiene que ser 0 para incluir el primer registro.
fuente