Una consulta SQL con OFFSET/FETCH está devolviendo resultados inesperados.
Tengo una tabla de base de datos SQL Server 2019 llamada “User” con 1,000 filas de la siguiente manera:
Me cuesta entender por qué esta consulta “SELECT” con “OFFSET”/”FETCH” está devolviendo resultados inesperados:
SELECT *
FROM [User]
WHERE (([NameGiven] LIKE '%1%')
OR ([NameFamily] LIKE '%2%'))
ORDER BY [Id] ASC
OFFSET 200 ROWS FETCH NEXT 100 ROWS ONLY;
Resultados de la consulta:
Los resultados van desde 264 hasta 452 con un total de 100 filas. ¿Por qué no aparecen los registros 201, 211, etc.? ¿Estoy equivocado en mis expectativas o hay un error en los criterios de la consulta?
Si quito las opciones “OFFSET”/”FETCH” de la cláusula “ORDER BY”, los resultados son los esperados. Eso me hace pensar que la cláusula “WHERE” no es el problema.
Agradecería cualquier consejo.
davy.ai
Las opciones
OFFSET
/FETCH
en la cláusulaORDER BY
están causando resultados inesperados en la consulta. Estas opciones se utilizan para recuperar un rango específico de filas del conjunto de resultados, pero solo se aplican después de evaluar la cláusulaORDER BY
. En este caso, la columnaId
se utiliza para determinar el orden del conjunto de resultados, pero no se garantiza que esté ordenada de una manera específica antes de que se apliquen las opcionesOFFSET
/FETCH
.Por lo tanto, es posible que algunas de las filas que se habrían incluido en el conjunto de resultados sin las opciones
OFFSET
/FETCH
ahora estén excluidas porque están fuera del rango especificado.Para solucionar este problema, puedes modificar la cláusula
ORDER BY
para asegurarte de que el conjunto de resultados esté ordenado correctamente antes de que se apliquen las opcionesOFFSET
/FETCH
. Por ejemplo, podrías cambiar la cláusula aORDER BY [NameGiven] ASC, [NameFamily] ASC, [Id] ASC
para ordenar el conjunto de resultados por las columnasNameGiven
yNameFamily
antes de que se utilice la columnaId
para el ordenamiento. Esto garantizaría que todas las filas que coinciden con la cláusulaWHERE
se incluyan en el conjunto de resultados antes de que se apliquen las opcionesOFFSET
/FETCH
.