Quais são as alternativas para uma cláusula ORDER BY em uma View?


12

Esta pergunta só precisava estar neste site :)

ORDER BY é proibido usar em uma visão, como eu entendi por causa da possibilidade de ordem múltipla por ao usar essa visão.

Eu sei que existem maneiras de contornar essa limitação, por exemplo TOP 99.999999 PERCENT, mas eu gostaria de saber qual é a melhor prática, não como cortá-la.

Portanto, se eu quiser criar visualizações no meu banco de dados para uso pessoal, o que significa que quero me conectar ao banco de dados e apenas ver os dados corrigidos e classificados, como devo fazê-lo se não conseguir solicitar uma visualização?

Atualmente, no meu banco de dados do SQL Server, tenho visualizações com o TOPhack e as uso muito, mas parece errado.


1
por que não TOP 100%?
garik

@garik - porque ainda não garante a encomenda se eu entender o link do gbn corretamente. É apenas uma resposta errada mais concisa
Jack diz que tente topanswers.xyz

1
@Jack Douglas não era uma resposta, era um comentário sobre top 99,999 ...
Garik

@garik - no SQL Server 2008, o TOP 100 PERCENT é ignorado e somente o uso de 99 está funcionando. Acho que foi corrigido, mas minha versão não é atualizada.
yellowblood

1
Esta não é uma limitação técnica. Isso é por design. É por isso que qualquer solução alternativa parece um hack. Imponha seu pedido nas consultas em relação às visualizações. Uma ordem se aplica a um conjunto de resultados (saída da consulta e.ge), não a uma coleção de dados (por exemplo, uma exibição ou tabela).
Nick Chammas

Respostas:


2

Não existe uma exibição "ordenada" porque uma exibição deve ser um conjunto de linhas. Use um procedimento armazenado se desejar uma ordem fixa.


Esta é a resposta que explica por que você não pode impor uma ordem dentro de uma definição de exibição. Um conjunto, por definição, não possui um pedido. Quando você combina TOPcom ORDER BY, no entanto, agora você está definindo um novo conjunto desde a ordenação afeta quais linhas são "top"; é por isso que TOPpermite usar ORDER BYem uma definição de exibição.
Nick Chammas

9

Somente o ORDER BY mais externo garantirá a ordem

  • Qualquer ORDER BY intermediário ou interno é ignorado.
    Isso inclui ORDER BY em uma exibição
  • Não há ordem implícita em nenhuma tabela
  • Não há ordem implícita de nenhum índice (agrupado ou não) nessa tabela

Ligações

ORDER BY garante um resultado classificado apenas para a instrução SELECT mais externa de uma consulta. Por exemplo, considere a seguinte definição de exibição: (e exemplo a seguir que corresponde a esta pergunta)


Obrigado pelo esclarecimento, mas não é a resposta que eu estava procurando :) Estou tentando ver que tipo de alternativas existem para o ORDER BY muito conveniente dentro de uma visualização.
24911 yellowblood

3

Adicione um ORDER BY à saída da view, ie

  SELECT whatever FROM MYVIEW ORDER BY whatever

1
Não há ordem implícita por índice clusterizado. -1.
gbn 21/07

@SqlACID - boa edição, +1 em vez de -1 :)
Jack diz que tente topanswers.xyz

Isso significa que você precisa reescrever o pedido por cláusula sempre que consultar a visualização, que é o que estamos tentando evitar quando usamos a ordem dentro da visualização.
24911 yellowblood

como disse dportas, um wrapper de proc armazenado em torno da consulta funcionaria, mas provavelmente não é o que você está procurando.
SqlACID

Na verdade, tentei o procedimento armazenado, mas não foi fácil e rápido o suficiente para consultar ou manipular. Meh.
yellowblood
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.