6.3 Extension de la structure des requêtes SFW
143
© Dunod – La photocopie non autorisée est un délit.
Un élément de liste-valeurs est toute expression qui peut renvoyer une valeur :
le nom d’une colonne, une constante, une expression de calcul (arithmétique, chaîne
de caractère, temporel), ou une expression SFW qui renvoie une seule valeur.
Il existe différents moyens de définir une table selon expression-de-table,
qui tous ont comme propriété de renvoyer une suite de lignes : une table réelle de
base ou une vue (le cas le plus fréquent), l’union (intersection, différence) de deux
tables (elles-mêmes réelles ou vues), la jointure de deux tables (réelles ou vues) ou
le résultat d’une requête SFW, qui, comme on le sait, renvoie une suite de lignes.
L’élégance de cette définition vient de sa récursivité : on peut rédiger une requête
SFW dont la clause from contient la jointure de tables définies par des requêtes
SFW, et ainsi de suite. Il faut reconnaître que les développeurs de SGBD n’apprécient que très modérément cette puissance, et que, dans la réalité, ces possibilités
sont souvent fortement bridées, voire ignorées (l’interpréteur, hagard, déclarant
forfait, parfois sans avertissement 11 ). Au lecteur de vérifier les possibilités offertes
par son SGBD.
6.3.3 Les requêtes récursives
Comme nous l’avons constaté lors de l’étude des structures cycliques (section
5.4.5), SQL2 ne permet pas d’effectuer une auto-jointure de manière itérative le
nombre de fois nécessaire pour épuiser une structure hiérarchique. Des extensions
sont proposées dans SQL3, dont une variante est disponible dans Oracle. Nous
illustrerons cette dernière en construisant la requête qui donne l’organigramme des
personnes qui dépendent, directement ou non, de la personne p4.
select LEVEL, NPERS, NOM, RESPONSABLE
from
PERSONNE
start with NPERS = 'p4'
connect by prior NPERS = RESPONSABLE
Les clauses start with et connect to indiquent que cette requête est à appliquer
de manière récursive :
• start with : spécifie le point de départ de la recherche (PERSONNE dont
NPERS = 'p4');
• connect : indique comment on passe d’un niveau au suivant; RESPONSABLE est la colonne de la ligne inférieure qui doit être égale (=) à la colonne
NPERS de la ligne supérieure (prior); à partir d’une ligne PERSONNE P
déjà sélectionnée, la requête recherche toutes les lignes dont la valeur de
RESPONSABLE est égale à celle de NPERS de P;
• la clause where (absente dans l’exemple) filtre les lignes sélectionnée;
11. Oracle avertit très honnêtement que l’exécution d’une requête peut produire des résultats
erronés lorsque celle-ci est trop complexe, mais sans préciser ce que ce terme veut dire.
Précédent

- 143/436

Suivant