postgres ilike dates sql postgresql order limit offset

ilike - sql between postgres



PostgreSQL-repitiendo filas desde LIMIT OFFSET (2)

Noté algunas filas repetidas en un conjunto de registros paginado.

Cuando ejecuto esta consulta:

SELECT "students".* FROM "students" ORDER BY "students"."status" asc LIMIT 3 OFFSET 0

Yo obtengo:

| id | name | status | | 1 | foo | active | | 12 | alice | active | | 4 | bob | active |

Siguiente consulta:

SELECT "students".* FROM "students" ORDER BY "students"."status" asc LIMIT 3 OFFSET 3

Yo obtengo:

| id | name | status | | 1 | foo | active | | 6 | cindy | active | | 2 | dylan | active |

¿Por qué aparece "foo" en ambas consultas?


¿Por qué aparece "foo" en ambas consultas?

Porque todas las filas que se devuelven tienen el mismo valor para la columna de status . En ese caso, la base de datos es libre de devolver las filas en el orden que desee.

Si desea una orden reproducible, necesita agregar una segunda columna a su orden por declaración para que sea consistente. Por ejemplo, la columna de ID:

SELECT students.* FROM students ORDER BY students.status asc, students.id asc

Si dos filas tienen el mismo valor para la columna de estado, serán ordenadas por el ID.


Para obtener más detalles de la documentación de PostgreSQL ( http://www.postgresql.org/docs/8.3/static/queries-limit.html ):

Cuando se usa LIMIT, es importante usar una cláusula ORDER BY que restringe las filas de resultados en un orden único . De lo contrario, obtendrá un subconjunto impredecible de las filas de la consulta. Podrías estar preguntando por la décima a la vigésima fila, pero de la décima a la vigésima en qué orden? El orden es desconocido, a menos que haya especificado ORDER BY.

El optimizador de consultas tiene en cuenta a LIMIT al generar un plan de consultas, por lo que es muy probable que obtenga diferentes planes (que producen diferentes órdenes de fila) dependiendo de lo que otorgue para LIMIT y OFFSET. Por lo tanto, el uso de diferentes valores de LIMIT / OFFSET para seleccionar diferentes subconjuntos de un resultado de la consulta dará resultados inconsistentes a menos que aplique un orden de resultados predecible con ORDER BY. Esto no es un error; es una consecuencia inherente del hecho de que SQL no promete entregar los resultados de una consulta en ningún orden en particular a menos que se use ORDER BY para restringir el orden.