Encontrei uma pergunta respondida com a Row_Number()
função na cláusula where. Quando tentei uma consulta, recebi o seguinte erro:
"Msg 4108, Nível 15, Estado 1, Linha 1 As funções em janela só podem aparecer nas cláusulas SELECT ou ORDER BY."
Aqui está a consulta que tentei. Se alguém souber como resolver isso, por favor me avise.
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
fonte
fonte
ROW_NUMBER() OVER (ORDER BY employee_id) > 0
sempre avaliará comoTRUE
Respostas:
Para contornar esse problema, envolva sua instrução select em uma CTE e, então, você pode consultar a CTE e usar os resultados da função em janela na cláusula where.
fonte
ROW_NUMBER()
naWHERE
cláusula sem CTE :(Observe que este filtro é redundante:
ROW_NUMBER()
começa1
e é sempre maior que0
.fonte
AS q
vez disso, mas também funcionaria).rn
é um acrônimo meio que universalmente aceito para o número da linha atualmente. Tente digitar "row_number over as ..." na string de pesquisa do Google e veja o que isso sugere para você.fonte
Eu acho que você quer algo assim:
fonte
From V_EMPLOYEE) A
adiciona A como alias.Em resposta aos comentários sobre a resposta do rexem, com relação a se uma visão inline ou CTE seria mais rápida, eu reformulei as consultas para usar uma tabela que I, e todos, tinham disponível: sys.objects.
Os planos de consulta produzidos eram exatamente os mesmos. Eu esperaria que, em todos os casos, o otimizador de consulta surgisse com o mesmo plano, pelo menos na simples substituição de CTE por visualização em linha ou vice-versa.
Claro, tente suas próprias consultas em seu próprio sistema para ver se há uma diferença.
Além disso,
row_number()
na cláusula where é um erro comum nas respostas dadas no Stack Overflow. Logicamenterow_number()
não está disponível até que a cláusula de seleção seja processada. As pessoas esquecem isso e, quando respondem sem testar a resposta, às vezes a resposta está errada. (Uma acusação da qual eu mesmo sou culpado.)fonte
Acho que todas as respostas que mostram o uso de um CTE ou Sub Query são correções suficientes para isso, mas não vejo ninguém chegando ao cerne de por que OP tem um problema. O motivo pelo qual o OP sugerido não funciona é devido à ordem lógica de processamento da consulta aqui:
Acredito que isso contribui muito para a resposta, porque explica por que problemas como este ocorrem.
WHERE
é sempre processado antes deSELECT
fazer uma CTE ou Sub Query necessária para muitas funções. Você verá muito isso no SQL Server.fonte
Usando CTE (SQL Server 2005+):
Usando visualização embutida / alternativa equivalente não CTE:
fonte
SQL Server
,CTE
'se Inline são a mesma coisa e têm o mesmo desempenho. Quando funções não determinísticas são usadas em aCTE
, ela é reavaliada a cada chamada. É preciso usar truques sujos para forçar a materialização de umCTE
. Veja estes artigos em meu blog: explainextended.com/2009/07/28/… explainextended.com/2009/05/28/generating-xml-in-subqueriescom base na resposta do OP à pergunta:
o "método 1" é como a consulta do OP da pergunta vinculada e o "método 2" é como a consulta da resposta selecionada. Você teve que olhar o código vinculado a esta resposta para ver o que realmente estava acontecendo, já que o código na resposta selecionada foi modificado para funcionar. Experimente isto:
RESULTADO:
fonte
fonte
fonte