Encontré una pregunta respondida con la Row_Number()
función en la cláusula where. Cuando probé una consulta, recibí el siguiente error:
"Msg 4108, nivel 15, estado 1, línea 1 Las funciones con ventana solo pueden aparecer en las cláusulas SELECT o ORDER BY".
Aquí está la consulta que intenté. Si alguien sabe cómo resolver esto, hágamelo saber.
SELECT employee_id
FROM V_EMPLOYEE
WHERE row_number() OVER ( ORDER BY employee_id ) > 0
ORDER BY Employee_ID
sql
sql-server
tsql
analytic-functions
JohnnyRose
fuente
fuente
ROW_NUMBER() OVER (ORDER BY employee_id) > 0
siempre evaluará aTRUE
Respuestas:
Para solucionar este problema, envuelva su declaración de selección en un CTE, y luego puede consultar el CTE y usar los resultados de la función en ventana en la cláusula where.
fuente
ROW_NUMBER()
enWHERE
sin CTE :(Tenga en cuenta que este filtro es redundante:
ROW_NUMBER()
comienza desde1
y siempre es mayor que0
.fuente
AS q
lugar, pero esto tampoco funcionaría).rn
es un acrónimo universalmente aceptado para el número de fila en estos días. Intente escribir "número_de_fila como ..." en la cadena de búsqueda de Google y vea lo que le sugiere.fuente
Creo que quieres algo como esto:
fuente
From V_EMPLOYEE) A
que agrega A como alias.En respuesta a los comentarios sobre la respuesta de rexem, con respecto a si una vista en línea o CTE sería más rápida, modifiqué las consultas para usar una tabla que yo, y todos, teníamos disponible: sys.objects.
Los planes de consulta producidos fueron exactamente los mismos. En todos los casos, esperaría que el optimizador de consultas presentara el mismo plan, al menos en un simple reemplazo de CTE con vista en línea o viceversa.
Por supuesto, pruebe sus propias consultas en su propio sistema para ver si hay alguna diferencia.
Además,
row_number()
en la cláusula where hay un error común en las respuestas dadas en Stack Overflow. Logicalyrow_number()
no está disponible hasta que se procesa la cláusula de selección. Las personas olvidan eso y cuando responden sin probar la respuesta, la respuesta a veces es incorrecta. (Un cargo del que yo mismo he sido culpable).fuente
Siento que todas las respuestas que muestran el uso de CTE o Sub Query son soluciones suficientes para esto, pero no veo que nadie llegue al corazón de por qué OP tiene un problema. La razón por la que lo que OP sugirió no funciona se debe al orden de procesamiento de consultas lógicas aquí:
Creo que esto contribuye en gran medida a la respuesta, porque explica por qué ocurren problemas como este.
WHERE
siempre se procesa antes deSELECT
hacer un CTE o Sub Query necesario para muchas funciones. Verá esto mucho en SQL Server.fuente
Usando CTE (SQL Server 2005+):
Uso de la vista en línea / alternativa no equivalente a CTE:
fuente
SQL Server
,CTE
's y vistas en línea son la misma cosa y tener el mismo rendimiento. Cuando se utilizan funciones no deterministas en aCTE
, se reevalúan en cada llamada. Uno tiene que usar trucos sucios para forzar la materialización de unCTE
. Vea estos artículos en mi blog: explainextended.com/2009/07/28/… explainextended.com/2009/05/28/generating-xml-in-subqueriesbasado en la respuesta de OP a la pregunta:
El "método 1" es como la consulta del OP de la pregunta vinculada, y el "método 2" es como la consulta de la respuesta seleccionada. Tenía que mirar el código vinculado en esta respuesta para ver qué estaba sucediendo realmente, ya que el código en la respuesta seleccionada se modificó para que funcione. Prueba esto:
SALIDA:
fuente
fuente
fuente