Tutoriaux
Vous avez déjà rencontré des tables récursives en SQL ? C'est-à-dire, des tables qui pointent sur elle-même! Pour parcourir ce genre de table, il ne suffit pas d'un simple SELECT. Il vous faut un peu plus! Il existe quelques manières différentes afin de parcourir l'"arbre" de cette table.
Voyons une de ces méthodes. Tout d'abord pour parcourir votre arbre, il vous faut un point de départ au processus de récursion. Cela doit se faire avec 2 requêtes liées. La 1re requête indique où l'on doit commencer et la seconde où l'on doit se rendre ensuite. Ces 2 requêtes doivent être jointes par l'opérateur UNION ALL. Par la suite, il vous faudra effectuer une corrélation entre l'expression de requête CTE et le code SQL en référençant l'alias de requête à l'intérieur du code SQL exprimant la CTE.
Voyons un exemple de table concret. Celle-ci contient les champs ci-dessous :
NiveauId INTEGER PRIMARY KEY Desc NVARCHAR(50) fkNiveauParent INTEGER FOREIGN KEY
Compagnie XYZ |-- Division XYZ | |-- Département 1 | |-- Département 2 | | |-- Poste X |-- Division XYW | |-- Département 6 | | |-- Poste U | | |-- Poste W
La hiérarchie est représentée grâce à une auto-référence. C'est-à-dire qu'on a inséré une clé étrangère dans notre table en provenance de la clé même de la table. En d'autres mots, la clé étrangère, pointe sur la clé primaire de notre table. Donc pour obtenir la hiérarchie il faut commencer par déterminer notre point de départ. Ici, nous désirons obtenir la hiérarchie du "Poste X".
SELECT Desc, fkNiveauParent FROM maTableNiveau WHERE Desc = "Poste X"
Pour avancer dans notre arbre, il nous faut alors récupérer l'identifiant du père (fkNiveauParent) et lier les 2 requêtes grâce à l'UNION ALL.
UNION ALL SELECT Desc, fkNiveauParent FROM maTableNiveau
Nous obtenons donc :
SELECT Desc, fkNiveauParent FROM maTableNiveau WHERE Desc = "Poste X" UNION ALL SELECT Desc, fkNiveauParent FROM maTableNiveau
Bâtissons maintenant la CTE :
WITH tree (desc, id) AS( SELECT Desc, fkNiveauParent FROM maTableNiveau WHERE Desc = "Poste X" UNION ALL SELECT Desc, fkNiveauParent FROM maTableNiveau )
Nous sommes maintenant prêts à faire la récursion. L'étape suivante consiste à effectuer le cycle de récursion. Cela se fait en référençant le nom de notre CTE ici "tree" à l'intérieur même de l'expression. Pour ce faire, dans la seconde requête de notre expression, nous devons effectuer une jointure entre la table "tree" et notre table "maTableNiveau" et assurer le chaînage par une jointure entre les identifiants "tree.id" et "NiveauId".
WITH tree (desc, id) AS( SELECT Desc, fkNiveauParent FROM maTableNiveau WHERE Desc = "Poste X" UNION ALL SELECT Desc, fkNiveauParent FROM maTableNiveau monAlias INNER JOIN tree ON tree.id = monAlias.NiveauId ) SELECT * FROM tree
Et voilà, le tour est joué vous obtiendrez la hiérarchie du "Poste X".
data id --------------- --- Poste X 8 Département 2 6 Division XYZ 3 Compagnie XYZ NULL
Vu: 845
Commentaires (1)

Ecrivez un commentaire
Navigation
Connexion
Publicités
MeilleursPrix.ca
|
|
















J'ai créé sans y prendre garde une table de ce type. Or à present j'aimerais afficher EXACTEMENT votre première liste :
Compagnie XYZ
|-- Division XYZ
| |-- Département 1
| |-- Département 2
| | |-- Poste X
|-- Division XYW
| |-- Département 6
| | |-- Poste U
| | |-- Poste W
mais j'ignore comment faire ça en PHP SQL...