Le langage SQL nous permet
d'ordonnancer le résultat d'une requête avec la clause ORDER BY,
mais cet clause n'est pas assez flexible pour lui indiquer un ordre
prédéfini qui n'est pas nécessairement ascendant ou descendant.
Par contre, il existe des
techniques pour contourner cette limitation. La première technique
consiste à se définir un ensemble de données qui va contenir
l'ordre dans lequel on veut nos résultat.
Par exemple, prenons la
table HumanResources.Department de la base de données
AdventuresWorks.
Nous voudrions ordonnancer
notre résultat en fonction de l'emplacement du départemant dans
l'usine, de sorte qu'un personne puisse suivre le rapport tout en
marchant dans l'entreprise dans un ordre logique, selon la
disposition des locaux, informations qui n'est pas dans la base de
données.
L'ordre dans lequel on
veut notre résultat est le suivant :
- Executive General and Administration
- Manufacturing
- Quality assurance
- Inventory Management
- Sales and Marketing
- Research and Development
Pour se faire, on se créer
un ensemble de données statique qu'on vient joindre à la requête pour
ensuitre ordonnancer le résultat selon l'ordre qu'on lui a donné.
Nos données sont
maintenant ordonnancées selon l'ordre voulu.
Bien que cette méthode
fonctionne bien, elle a le désavantage d'augmenter
la taille de notre ensemble de données en plus d'ajouter une jointure, d'être statique et
que tous les éléments doivent être définis.
Pour palier à ces problèmes, nous avons deux options, soit modifier la jointure pour un
LEFT JOIN, soit utiliser une deuxième technique, utiliser une
logique dans la clause ORDER BY.
Modifier la jointure pour
un LEFT JOIN se fait facilement, il suffit de mettre dans notre ordre
de présentation seulement les valeurs qu'on veut prioriser et de
substituer les valeurs manquantes par une valeur par défaut dans la
clause ORDER BY.
Dans la dernière requête,
on voulait mettre de l'avant les départements qui nous semblait les
plus prioritaire, soit “Quality Assurance” et “Manufacturing”.
Les autres départements n'étant pas prioritaire, ils sont
simplement affichés à la suite selon un ordre choisi par le SGBD, ce qui ne sera pas nécessairement un ordre logique, comme on peut le voir avec les enregistrements 8 à13.
Nous
aurions pus avoir le même résultat en utilisant la deuxième
technique. En utilisant l'instruction CASE WHEN dans un ORDER BY au lieu du LEFT JOIN,
nous pouvons supprimer la jointure et la logique est exécutée
seulement sur les occurrences contenues dans le résultat plutôt
qu'à l'ensemble des données.
Une dernière technique
d'ordonnancement des données nous permet d'ordonnancer les données
de façon quasi-aléatoire. Lorsqu'on a besoin, par exemple, d'un
exemple de données et qu'on ne veut pas toujours avoir les mêmes
données, nous pouvons utiliser la fonction NEWID() pour
l'ordonnancement. La fonction NEWID() retourne une valeur de type
GUID qui change à chaque occurence, ce qui nous donne donc un ordre
différent à chaque exécution.
Références:
Aucun commentaire:
Publier un commentaire