Por exemplo, considere a consulta SQL:
SELECT
A.[Name],
ROW_NUMBER() OVER(ORDER BY A.[Name] ASC)
FROM
[FooTable] AS A
Aqui, observo os resultados retornados, classificados por A. [Nome]. Se eu alterar a coluna de classificação definida na função ROW_NUMBER para outra coluna, novamente os resultados serão classificados por essa coluna.
Eu esperava que o número da linha fosse atribuído às linhas, mas não esperava que as linhas retornassem classificadas pelo mesmo critério. Isso é simplesmente um efeito colateral de como a consulta está sendo executada (no meu caso no SQL Server 2008 R2) ou esse comportamento é garantido? (Não encontrei referência a essa garantia).
sql-server-2008-r2
order-by
redcalx
fonte
fonte
Respostas:
Se você fez a pergunta, acho que realmente queria perguntar:
Poderíamos ter dito para você criar um alias para a
ROW_NUMBER()
expressão e classificar usando o alias:Agora você só precisa alterar a expressão em um local e a classificação resultante será baseada nessa expressão sem precisar repeti-la.
fonte
repeating the complex ORDER BY expression
nem garante que a saída será emitida por ordem ROW_NUMBER (). A menos que as colunas na cláusula ORDER BY formem uma chave exclusiva.Absolutamente não. Prova:
A única maneira de garantir um pedido no SQL é solicitar, usar
ORDER BY
no próprio resultado.fonte
Na verdade, a questão (antiga) poderia ser estendida para incluir também a partição por parte, pois parece haver uma ordem implícita primeiro pela partição e depois pela ordem por parte (s)
Portanto, não é tão simples como alguns sugeriram para atribuir o número da linha e usá-lo para fazer pedidos.
Também precisaríamos de um sql aninhado para extrair a partição por cláusula (se não quisermos simplesmente repeti-la, é claro)
Empiricamente , parecemos ter a última linha de pedidos implicitamente
Mas o que nos falta é qualquer prova ou garantia de que ele sempre seja válido.
(Se houver várias chamadas Row_Number () em execução, é a ÚLTIMA que parece dar a ordem)
OBSERVAÇÃO TAMBÉM: se você adicionar explicitamente a ordem pelo plano de execução, mostrará claramente uma etapa final de classificação, e classificar um conjunto já classificado é o pior dos casos; portanto, leva muito mais tempo com o Order By do que sem
fonte