Estoy interesado en aprender algunos (idealmente) de base de datos agnóstico formas de seleccionar el n º fila de una tabla de base de datos. También sería interesante ver cómo se puede lograr esto utilizando la funcionalidad nativa de las siguientes bases de datos:
- servidor SQL
- MySQL
- PostgreSQL
- SQLite
- Oráculo
Actualmente estoy haciendo algo como lo siguiente en SQL Server 2005, pero estaría interesado en ver otros enfoques más agnósticos:
WITH Ordered AS (
SELECT ROW_NUMBER() OVER (ORDER BY OrderID) AS RowNumber, OrderID, OrderDate
FROM Orders)
SELECT *
FROM Ordered
WHERE RowNumber = 1000000
Crédito por el SQL anterior: el blog de Firoz Ansari
Actualización: Vea la respuesta de Troels Arvin con respecto al estándar SQL. Troels, ¿tienes algún enlace que podamos citar?
OrderNo N
, introduzca una columna OrderSequenceNo en la tabla y generarla desde un generador de secuencia independiente al crear un nuevo orden.offset x fetch first y rows only
. Actualmente soportado por (al menos) Postgres, Oracle12, DB2.Respuestas:
Hay formas de hacerlo en partes opcionales del estándar, pero muchas bases de datos admiten su propia forma de hacerlo.
Un sitio realmente bueno que habla sobre esto y otras cosas es http://troels.arvin.dk/db/rdbms/#select-limit .
Básicamente, PostgreSQL y MySQL son compatibles con el no estándar:
Oracle, DB2 y MSSQL son compatibles con las funciones estándar de ventanas:
(que acabo de copiar del sitio vinculado anteriormente ya que nunca uso esos DB)
Actualización: a partir de PostgreSQL 8.4, se admiten las funciones estándar de ventanas, por lo que se espera que el segundo ejemplo funcione también para PostgreSQL.
Actualización: SQLite agregó funciones de ventana compatibles con la versión 3.25.0 en 2018-09-15, por lo que ambos formularios también funcionan en SQLite.
fuente
WHERE rownumber = n
para obtener la enésima fila?PostgreSQL admite funciones de ventanas definidas por el estándar SQL, pero son incómodas, por lo que la mayoría de la gente usa (el no estándar)
LIMIT
/OFFSET
:Este ejemplo selecciona la fila 21.
OFFSET 20
le dice a Postgres que omita los primeros 20 registros. Si no especifica unaORDER BY
cláusula, no hay garantía de qué registro obtendrá, lo que rara vez es útil.fuente
No estoy seguro del resto, pero sé que SQLite y MySQL no tienen ningún orden de fila "predeterminado". En esos dos dialectos, al menos, el siguiente fragmento toma la decimoquinta entrada de the_table, ordenando por la fecha / hora en que se agregó:
(por supuesto, necesitaría tener un campo DATETIME agregado y establecerlo en la fecha / hora en que se agregó esa entrada ...)
fuente
SQL 2005 y superior tiene esta característica incorporada. Use la función ROW_NUMBER (). Es excelente para páginas web con un estilo de navegación << Anterior y Siguiente >>:
Sintaxis:
fuente
Sospecho que esto es muy ineficiente, pero es un enfoque bastante simple, que funcionó en un pequeño conjunto de datos en el que lo probé.
Esto obtendría el quinto elemento, cambiar el segundo número superior para obtener un enésimo elemento diferente
Solo servidor SQL (creo), pero debería funcionar en versiones anteriores que no admiten ROW_NUMBER ().
fuente
1 cambio pequeño: n-1 en lugar de n.
fuente
Verifíquelo en SQL Server:
¡Esto te dará la décima fila de la tabla emp!
fuente
Al contrario de lo que afirman algunas de las respuestas, el estándar SQL no guarda silencio sobre este tema.
Desde SQL: 2003, ha podido usar "funciones de ventana" para omitir filas y limitar conjuntos de resultados.
Y en SQL: 2008, se agregó un enfoque un poco más simple, utilizando
OFFSET skip ROWS FETCH FIRST n ROWS ONLY
Personalmente, no creo que la adición de SQL: 2008 fuera realmente necesaria, por lo que si fuera ISO, lo habría mantenido fuera de un estándar ya bastante grande.
fuente
Cuando solíamos trabajar en MSSQL 2000, hicimos lo que llamamos el "triple flip":
EDITADO
No era elegante ni rápido, pero funcionó.
fuente
IF / ELSE IF
bloques debajo delOuterPageSize
cálculo: en las páginas 1 y 2, volverán a colocar elOuterPageSize
valor en 10. En la página 3 (filas 21-25) el cálculo devolverá correctamente 5, y en todas las páginas 4 y superiores, el resultado negativo del cálculo se reemplazará por 0 (aunque probablemente sería más rápido devolver una fila de datos vacía inmediatamente en ese punto).Seleccione el registro n 'th desde arriba
seleccione el registro n desde el fondo
fuente
Oráculo:
fuente
where ROWNUM = x
solo funcionará para x = 1 en Oracle DB. es decirwhere ROWNUM = 2
, no devolverá ninguna fila.En Oracle 12c, puede usar la
OFFSET..FETCH..ROWS
opción conORDER BY
Por ejemplo, para obtener el 3er registro desde arriba:
fuente
Aquí hay una solución rápida de su confusión.
Aquí puede obtener la última fila completando N = 0, la segunda última mediante N = 1, la cuarta última completando N = 3 y así sucesivamente.
Esta es una pregunta muy común sobre la entrevista y es muy simple.
Además, si desea Cantidad, ID o algún Orden de clasificación numérico, puede utilizar la función CAST en MySQL.
Aquí Al completar N = 4, podrá obtener el quinto último registro de la cantidad más alta de la tabla CART. Puede ajustar su nombre de campo y tabla y encontrar una solución.
fuente
AÑADIR:
Eso limitará los resultados a un resultado que comience en el resultado n.
fuente
Por ejemplo, si desea seleccionar cada décima fila en MSSQL, puede usar;
Simplemente tome el MOD y cambie el número 10 aquí cualquier número que desee.
fuente
Para SQL Server, una forma genérica de ir por número de fila es la siguiente:
Por ejemplo:
Esto devolverá la información de la fila 20. Asegúrese de poner el recuento de filas 0 después.
fuente
LIMIT n, 1 no funciona en MS SQL Server. Creo que es la única base de datos importante que no admite esa sintaxis. Para ser justos, no es parte del estándar SQL, aunque es tan ampliamente compatible que debería serlo. En todo excepto el servidor SQL LIMIT funciona muy bien. Para el servidor SQL, no he podido encontrar una solución elegante.
fuente
Aquí hay una versión genérica de un sproc que escribí recientemente para Oracle que permite la paginación / clasificación dinámica: HTH
fuente
Pero realmente, ¿no es todo esto realmente solo trucos de salón para un buen diseño de base de datos en primer lugar? Las pocas veces que necesitaba una funcionalidad como esta era para una simple consulta para hacer un informe rápido. Para cualquier trabajo real, el uso de trucos como estos es un problema atractivo. Si se necesita seleccionar una fila en particular, simplemente tenga una columna con un valor secuencial y termine con ella.
fuente
Para el servidor SQL, lo siguiente devolverá la primera fila de la tabla.
Puede recorrer los valores con algo como esto:
fuente
En Sybase SQL Anywhere:
No olvides ORDER BY o no tiene sentido.
fuente
T-SQL: selección del N ° de registro de una tabla
Por ejemplo, para seleccionar el 5º registro de una tabla Empleado, su consulta debe ser
fuente
fuente
He escrito esta consulta para encontrar la enésima fila. Ejemplo con esta consulta sería
fuente
increíble que puedas encontrar un motor SQL ejecutando este ...
fuente
Nada sofisticado, sin funciones especiales, en caso de que uses Caché como yo ...
Dado que tiene una columna de ID o una columna de sello de fecha en la que puede confiar.
fuente
Así es como lo haría dentro de DB2 SQL, creo que el RRN (número de registro relativo) está almacenado en la tabla por el O / S;
fuente
Primero seleccione las 100 filas superiores ordenando en forma ascendente y luego seleccione la última fila ordenando en forma descendente y limite a 1. Sin embargo, esta es una declaración muy costosa ya que accede a los datos dos veces.
fuente
Me parece que, para ser eficiente, necesita 1) generar un número aleatorio entre 0 y uno menos que el número de registros de la base de datos, y 2) poder seleccionar la fila en esa posición. Desafortunadamente, diferentes bases de datos tienen diferentes generadores de números aleatorios y diferentes formas de seleccionar una fila en una posición en un conjunto de resultados; por lo general, especifica cuántas filas omitir y cuántas filas desea, pero se hace de manera diferente para diferentes bases de datos. Aquí hay algo que me funciona en SQLite:
Depende de poder usar una subconsulta en la cláusula límite (que en SQLite es LIMIT <recs to skip>, <recs to take>) Seleccionar el número de registros en una tabla debería ser particularmente eficiente, ya que forma parte de la base de datos metadatos, pero eso depende de la implementación de la base de datos. Además, no sé si la consulta realmente generará el conjunto de resultados antes de recuperar el enésimo registro, pero espero que no sea necesario. Tenga en cuenta que no estoy especificando una cláusula "ordenar por". Podría ser mejor "ordenar por" algo como la clave primaria, que tendrá un índice: obtener el enésimo registro de un índice podría ser más rápido si la base de datos no puede obtener el enésimo registro de la base de datos sin construir el conjunto de resultados .
fuente
La respuesta más adecuada que he visto en este artículo para el servidor SQL
fuente