En PostgreSQL existen las palabras clave Limit
y Offset
que permitirán una paginación muy fácil de los conjuntos de resultados.
¿Cuál es la sintaxis equivalente para SQL Server?
sql
sql-server
pagination
limit
offset
Earlz
fuente
fuente
Respuestas:
El equivalente de
LIMIT
esSET ROWCOUNT
, pero si desea paginación genérica, es mejor escribir una consulta como esta:La ventaja aquí es la parametrización del desplazamiento y el límite en caso de que decida cambiar sus opciones de paginación (o permitir que el usuario lo haga).
Nota: el
@Offset
parámetro debe usar una indexación basada en uno para esto en lugar de la indexación normal basada en cero.fuente
WHERE RowNum >= (@Offset + 1)
The ORDER BY clause is invalid in views, inline functions, derived tables, subqueries, and common table expressions, unless TOP or FOR XML is also specified
. MSSQL2008 R2.Table
tiene 200k registros, primero buscará todos y luego aplicará el límite. ¿Es eficiente esta consulta?Esta característica ahora se simplifica en SQL Server 2012. Esto funciona desde SQL Server 2012 en adelante.
Límite con desplazamiento para seleccionar 11 a 20 filas en SQL Server:
OFFSET
: número de filas omitidasNEXT
: número requerido de filas siguientesReferencia: https://docs.microsoft.com/en-us/sql/t-sql/queries/select-order-by-clause-transact-sql?view=sql-server-2017
fuente
SQL_CALC_FOUND_ROWS
cuando se usa esto?Una nota: esta solución solo funcionará en SQL Server 2005 o superior, ya que esto fue cuando
ROW_NUMBER()
se implementó.fuente
AS xx
Puede usar ROW_NUMBER en una expresión de tabla común para lograr esto.
fuente
Para mí, el uso de OFFSET y FETCH juntos fue lento, por lo que utilicé una combinación de TOP y OFFSET como esta (que fue más rápido):
Nota: Si usa TOP y OFFSET juntos en la misma consulta como:
Luego obtiene un error, por lo que para usar TOP y OFFSET juntos debe separarlo con una subconsulta.
Y si necesita usar SELECT DISTINCT, la consulta es como:
Nota: El uso de SELECT ROW_NUMBER con DISTINCT no funcionó para mí.
fuente
SELECT TOP 20 id FROM table1 where id > 10 order by date OFFSET 20 rows
, debe transformarlo comoSELECT TOP 20 * FROM (SELECT id FROM table1 where id > 10 order by date OFFSET 20 ROWS) t1
. Editaré mi respuesta. Gracias y disculpa mi inglés.Otra muestra:
fuente
Hay aquí alguien que le dice acerca de esta característica en SQL 2011, es triste que elijan un poco de la palabra llave "OFFSET / FETCH" pero no es standart que bien.
fuente
Agregando una ligera variación en la solución de Aaronaught, típicamente parametrizo el número de página (@PageNum) y el tamaño de la página (@PageSize). De esta manera, cada evento de clic de página solo envía el número de página solicitado junto con un tamaño de página configurable:
fuente
Lo más cerca que puedo hacer es
Que supongo que es similar a
select * from [db].[dbo].[table] LIMIT 0, 10
fuente
fuente
fuente
fuente
Como nadie proporcionó este código todavía:
Puntos importantes:
@limit
se puede reemplazar con varios resultados para recuperar,@offset
es el número de resultados para omitirwhere
yorder by
cláusulas, y proporcionará resultados incorrectos si no están sincronizadosorder by
está ahí explícitamente si eso es lo que se necesita?fuente
Específicamente para SQL-SERVER, puede lograrlo de muchas maneras diferentes. Para un ejemplo real, tomamos la tabla Cliente aquí.
Ejemplo 1: con "SET ROWCOUNT"
Para devolver todas las filas, establezca ROWCOUNT en 0
Ejemplo 2: con "ROW_NUMBER y OVER"
Ejemplo 3: con "OFFSET y FETCH", pero con este "ORDER BY" es obligatorio
Espero que esto te ayude.
fuente
En el servidor SQL, usaría TOP junto con ROW_NUMBER ()
fuente
Desde entonces, pruebo más veces este script más útil en 1 millón de registros cada página. 100 registros con paginación funcionan más rápido. Mi PC ejecuta este script 0 segundos mientras lo comparo con mysql tiene su propio límite y compensa aproximadamente 4.5 segundos para obtener el resultado.
Alguien puede perder de entender Row_Number () siempre ordenar por campo específico. En caso de que necesitemos definir solo una fila en secuencia, debemos usar:
ROW_NUMBER () OVER (ORDER BY (SELECT NULL))
Explique:
fuente