es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

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:

User Table

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:

Query Results

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.

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Las opciones OFFSET/FETCH en la cláusula ORDER 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áusula ORDER BY. En este caso, la columna Id 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 opciones OFFSET/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 opciones OFFSET/FETCH. Por ejemplo, podrías cambiar la cláusula a ORDER BY [NameGiven] ASC, [NameFamily] ASC, [Id] ASC para ordenar el conjunto de resultados por las columnas NameGiven y NameFamily antes de que se utilice la columna Id para el ordenamiento. Esto garantizaría que todas las filas que coinciden con la cláusula WHERE se incluyan en el conjunto de resultados antes de que se apliquen las opciones OFFSET/FETCH.

Comments are closed.