Quelles sont les alternatives pour une clause ORDER BY dans une vue?

12

Cette question devait juste être dans ce site :)

ORDER BY est interdit d'utiliser dans une vue, comme je l'ai compris en raison de la possibilité de plusieurs commandes par lors de l'utilisation de cette vue.

Je sais qu'il existe des moyens de contourner cette limitation, par exemple TOP 99.999999 PERCENT, mais j'aimerais savoir quelle est la meilleure pratique, pas comment la pirater.

Donc, si je veux créer des vues dans ma base de données pour un usage personnel, ce qui signifie que je veux me connecter à la base de données et simplement voir les données corrigées et triées, comment dois-je le faire si je ne peux pas commander une vue?

Actuellement, dans ma base de données SQL Server, j'ai des vues avec le TOPhack, et je les utilise beaucoup, mais ça ne va pas.

yellowblood
la source
1
pourquoi pas TOP 100%?
garik
@garik - car il ne garantit toujours pas la commande si je comprends bien le lien de gbn. C'est juste une mauvaise réponse plus concise
Jack dit d'essayer topanswers.xyz
1
@Jack Douglas ce n'était pas une réponse, c'était un commentaire sur le top 99.999 ...
garik
@garik - dans SQL Server 2008, le TOP 100 PERCENT est ignoré et seul 99 fonctionne. Je pense qu'il a été corrigé mais ma version n'est pas mise à jour.
yellowblood
1
Ce n'est pas une limitation technique. C'est par conception. C'est pourquoi toute solution de contournement ressemble à un hack. Imposer votre commande dans les requêtes contre les vues. Un ordre s'applique à un ensemble de résultats (sortie de requête e.ge), et non à une collection de données (par exemple, une vue ou une table).
Nick Chammas

Réponses:

2

Une vue "ordonnée" n'existe pas car une vue est supposée être un ensemble de lignes. Utilisez une procédure stockée si vous souhaitez une commande fixe.

nvogel
la source
C'est la réponse qui explique pourquoi vous ne pouvez pas imposer un ordre dans une définition de vue. Un ensemble, par définition, n'a pas d'ordre. Cependant, lorsque vous combinez TOPavec ORDER BY, vous définissez maintenant un nouvel ensemble, car l'ordre affecte les lignes qui sont "en haut"; c'est pourquoi TOPvous permet d'utiliser ORDER BYdans une définition de vue.
Nick Chammas
9

Seule la commande la plus externe garantira la commande

  • Tout ORDER BY intermédiaire ou interne est ignoré.
    Cela inclut ORDER BY dans une vue
  • Il n'y a aucun ordre implicite dans aucune table
  • Il n'y a aucun ordre implicite d'aucun index (clusterisé ou non) sur cette table

Liens

ORDER BY garantit un résultat trié uniquement pour l'instruction SELECT la plus externe d'une requête. Par exemple, considérez la définition de vue suivante: (et suivez l'exemple qui correspond à cette question)

gbn
la source
Merci pour la clarification, mais ce n'est pas la réponse que je cherchais :) J'essaie de voir quel genre d'alternatives existe-t-il pour la commande très pratique à l'intérieur d'une vue.
yellowblood
3

Ajoutez un ORDER BY à la sortie de la vue, c.-à-d.

  SELECT whatever FROM MYVIEW ORDER BY whatever
SqlACID
la source
1
Il n'y a pas d'ordre implicite par index clusterisé. -1.
gbn
@SqlACID - bon montage, +1 au lieu de -1 :)
Jack dit d'essayer topanswers.xyz
Cela signifie que vous devez réécrire la clause order by à chaque fois que vous interrogez la vue, ce que nous essayons d'éviter lorsque nous utilisons la commande à l'intérieur de la vue.
yellowblood
comme l'a dit dportas, un wrapper proc stocké autour de la requête fonctionnerait, mais probablement pas ce que vous recherchez.
SqlACID
J'ai en fait essayé la procédure stockée, mais ce n'était pas facile et assez rapide pour interroger ou manipuler. Meh.
yellowblood