Quali sono le alternative per una clausola ORDER BY in una vista?


12

Questa domanda doveva essere solo in questo sito :)

È vietato utilizzare ORDER BY in una vista, come ho capito a causa della possibilità di più ordini per quando si utilizza questa vista.

So che ci sono modi per aggirare questa limitazione, ad esempio TOP 99.999999 PERCENT, ma vorrei sapere qual è la migliore pratica, non come hackerarla.

Quindi, se voglio creare viste nel mio database per uso personale, il che significa che voglio collegarmi al database e vedere solo i dati fissi e ordinati, come devo fare se non riesco a ordinare una vista?

Attualmente nel mio database di SQL Server ho viste con l' TOPhack e le sto usando molto, ma mi sembra sbagliato.


1
perché non TOP 100%?
garik,

@garik - perché non garantisce ancora l'ordinamento se comprendo correttamente il link di gbn. È solo una risposta sbagliata più concisa
Jack dice di provare topanswers.xyz il

1
@Jack Douglas non era una risposta, era un commento sui primi 99.999 ...
Garik,

@garik: in SQL Server 2008 la TOP 100 PERCENT viene ignorata e funziona solo con 99. Penso che sia stato risolto ma la mia versione non è stata aggiornata.
Sangue giallo

1
Questa non è una limitazione tecnica. Questo è di progettazione. Ecco perché qualsiasi soluzione alternativa sembra un trucco. Imponi il tuo ordine nelle query rispetto alle viste. Un ordine si applica a un set di risultati (output di query e.ge), non a una raccolta di dati (ad esempio una vista o una tabella).
Nick Chammas,

Risposte:


2

Non esiste una vista "ordinata" perché una vista dovrebbe essere un insieme di righe. Utilizzare una procedura memorizzata se si desidera un ordine fisso.


Questa è la risposta che spiega perché non è possibile imporre un ordinamento all'interno di una definizione di vista. Un set, per definizione, non ha un ordine. Quando si combina TOPcon ORDER BY, tuttavia, ora si sta definendo un nuovo set poiché l'ordinamento influenza quali righe sono "in alto"; questo è il motivo per cui TOPti consente di utilizzare ORDER BYuna definizione di vista
Nick Chammas,

9

Solo l'ordine ORDER BY più esterno garantirà l'ordine

  • Qualsiasi ORDER BY intermedio o interno viene ignorato.
    Ciò include ORDER BY in una vista
  • Non esiste un ordine implicito in nessuna tabella
  • Non esiste alcun ordine implicito da alcun indice (raggruppato o meno) su quella tabella

link

ORDER BY garantisce un risultato ordinato solo per l'istruzione SELECT più esterna di una query. Ad esempio, considera la seguente definizione di vista: (e segui l'esempio che corrisponde a questa domanda)


Grazie per il chiarimento, ma non è la risposta che stavo cercando :) Sto cercando di vedere che tipo di alternative ci sono per il comodo ORDER BY all'interno di una vista.
Sangue giallo

3

Aggiungi un ORDER BY all'output della vista, ad es

  SELECT whatever FROM MYVIEW ORDER BY whatever

1
Non esiste un ordine implicito per indice cluster. -1.
gbn

@SqlACID - buona modifica, +1 invece di -1 :)
Jack dice di provare topanswers.xyz il

Ciò significa che è necessario riscrivere la clausola order by ogni volta che si esegue una query sulla vista, che è ciò che stiamo cercando di evitare quando utilizziamo l'ordine all'interno della vista.
Sangue giallo

come diceva dportas, un wrapper proc memorizzato attorno alla query avrebbe funzionato, ma probabilmente non è quello che stai cercando.
SqlACID,

In realtà ho provato la procedura memorizzata ma non è stato abbastanza facile e veloce da interrogare o manipolare. Meh.
Sangue giallo
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.