dimanche 13 septembre 2015

Ordonnancer le résultat d'une requête selon un ordre défini ou aléatoire


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