Pour cet exemple, j'ai choisit une table contenant une typologie de véhicules :
-- creation de la table
CREATE TABLE T_VEHICULE (VHC_ID INTEGER NOT NULL PRIMARY KEY, VHC_ID_FATHER INTEGER
FOREIGN KEY REFERENCES T_VEHICULE (VHC_ID), VHC_NAME VARCHAR(16))
-- population
4 – Un premier exemple, une hiérarchie basique
INSERT INTO T_VEHICULE VALUES (1, NULL, ‘ALL’)
INSERT INTO T_VEHICULE VALUES (2, 1, ‘SEA’)
INSERT INTO T_VEHICULE VALUES (3, 1, ‘EARTH’)
INSERT INTO T_VEHICULE VALUES (4, 1, ‘AIR’)
INSERT INTO T_VEHICULE VALUES (5, 2, ‘SUBMARINE’)
INSERT INTO T_VEHICULE VALUES (6, 2, ‘BOAT’)
INSERT INTO T_VEHICULE VALUES (7, 3, ‘CAR’)
INSERT INTO T_VEHICULE VALUES (8, 3, ‘TWO WHEELES’)
INSERT INTO T_VEHICULE VALUES (9, 3, ‘TRUCK’)
INSERT INTO T_VEHICULE VALUES (10, 4, ‘ROCKET’)
INSERT INTO T_VEHICULE VALUES (11, 4, ‘PLANE’)
INSERT INTO T_VEHICULE VALUES (12, 8, ‘MOTORCYCLE’)
INSERT INTO T_VEHICULE VALUES (13, 8, ‘BYCYCLE’)
Habituellement une hiérarchie se représente en utilisant une auto référence, c’est à dire à l’aide d’une clef étrangère provenant de la clef même de la table. Les données de cette table peuvent se voir de la sorte :
ALL
|–SEA
| |–SUBMARINE
| |–BOAT
|–EARTH
| |–CAR
| |–TWO WHEELES
| | |–MOTORCYCLE
| | |–BYCYCLE
| |–TRUCK
|–AIR
|–ROCKET
|–PLANE
Commençons maintenant à exprimer une première interrogation et demandons-nous d’où vient la moto ? En d’autres termes, nous recherchons les ancêtres de MOTORCYCLE. Nous devons donc partir de la ligne qui contient la moto :
SELECT VHC_NAME, VHC_ID_FATHER FROM T_VEHICULE WHERE VHC_NAME = ‘MOTORCYCLE’
Nous devons récupérer la valeur de l’identifiant père (VHC_ID_FATHER) pour aller à l’étape suivante. La seconde requête, qui avance d’un pas dans l’arbre, doit être écrit comme suit :
SELECT VHC_NAME, VHC_ID_FATHER FROM T_VEHICULE
Comme on le voit, il n’y a aucune différence entre les deux requêtes à l’exception du filtre WHERE qui sert de point de départ. Souvenez-vous simplement que vous devez introduire un UNION ALL entre les deux requêtes afin d’assurer la liaison entre le départ et le pas suivant :
SELECT VHC_NAME, VHC_ID_FATHER FROM T_VEHICULE
WHERE VHC_NAME = ‘MOTORCYCLE’ UNION ALL SELECT VHC_NAME, VHC_ID_FATHER FROM T_VEHICULE
Plaçons maintenant cette requête composite dans code SQL qui bâtie l’expression de la CTE :
WITH
tree (data, id) AS (SELECT VHC_NAME, VHC_ID_FATHER FROM T_VEHICULE
WHERE VHC_NAME = ‘MOTORCYCLE’ UNION ALL
SELECT VHC_NAME, VHC_ID_FATHER FROM T_VEHICULE)
Nous sommes maintenant près de la récursion. La dernière étape de notre travail consiste à générer le cycle de récursion. Cela se fait en utilisant le nom de la CTE (ici "tree") à l’intérieur même de l’expression. Dans notre cas nous devons joindre à la seconde requête SELECT de l’expression CTE, la "table" tree à la table T_VEHICULE et assurer le chaînage par une jointure entre les identifiants : tree.id = (second query).VHC_ID. Cela se réalise ainsi :
WITH
tree (data, id)
AS (SELECT VHC_NAME, VHC_ID_FATHER
FROM T_VEHICULE
WHERE VHC_NAME = ‘MOTORCYCLE’
UNION ALL
SELECT VHC_NAME, VHC_ID_FATHER
FROM T_VEHICULE V
INNER JOIN tree t
ON t.id = V.VHC_ID)
SELECT * FROM tree
Il n’y a plus rien à faire que d’exprimer une requête finale, la plus simple possible, basée sur la CTE afin d’afficher les données :
data id
—————- ———–
MOTORCYCLE 8
TWO WHEELES 3
EARTH 1
ALL NULL
Regardons maintenant la façon dont nous avons lié les tables et la CTE d’une façon pseudo graphique :
correlation
___________________________________
| |
v |
WITH tree (data, id) |
AS (SELECT VHC_NAME, VHC_ID_FATHER |
FROM T_VEHICULE |
WHERE VHC_NAME = ‘MOTORCYCLE’ |
UNION ALL |
SELECT VHC_NAME, VHC_ID_FATHER |
FROM T_VEHICULE V |
INNER JOIN tree t <—————————-——-
ON t.id = V.VHC_ID) SELECT * FROM tree
La question que l’on peut se poser est la suivante : qu’est ce qui a stoppé le processus de récursion ? C’est simplement le fait que plus rien ne peut être chaîné dès que l’identifiant atteint le marqueur NULL, ce qui est le cas dans notre exemple lorsque nous atteignons la colonne ou VHC_NAME = "ALL". Maintenant vous avez la technique. Veuillez simplement noter que pour une raison que je ne m’explique pas encore, MS SQL Server n’accepte pas la présence du mot clef RECURSIVE suivant le mot clef WITH, alors que la norme le préconise…
Téléchargez cette ressource
SIEM & PME : Comment construire la boîte noire de votre SI ?
Passez à la cybersécurité proactive, transformez la collecte et l’analyse des logs en un bouclier dynamique contre les cybermenaces. Découvrez comment mettre en place une approche SIEM modulaire, évolutive et accessible, pour anticiper, détecter et réagir efficacement aux attaques.
Les articles les plus consultés
- Chiffrements symétrique vs asymétrique
- Activer la mise en veille prolongée dans Windows 10
- Partager vos images, vidéos, musique et imprimante avec le Groupe résidentiel
- Cybersécurité Active Directory et les attaques de nouvelle génération
- N° 2 : Il faut supporter des langues multiples dans SharePoint Portal Server
Les plus consultés sur iTPro.fr
- IA et bureaucratie : la complexité qui grève les projets
- IA dans les services financiers : priorité stratégique, mais passage à l’échelle sous tension
- Data streaming : le nouveau socle stratégique de l’IA en entreprise
- Ransomware en santé : la double extorsion fait exploser la facture en Europe
Articles les + lus
Model Context Protocol : le contexte, grand oublié du débat
Microsoft dévoile MAI-Thinking-1 : un modèle de raisonnement « enterprise-grade » en preview publique
Couchbase lance AI Data Plane pour industrialiser l’IA agentique
Windows 11 : Microsoft généralise le point-in-time restore pour accélérer la remise en service des PC
Computex 2026 : 5 signaux forts à retenir
À la une de la chaîne Tech
- Model Context Protocol : le contexte, grand oublié du débat
- Microsoft dévoile MAI-Thinking-1 : un modèle de raisonnement « enterprise-grade » en preview publique
- Couchbase lance AI Data Plane pour industrialiser l’IA agentique
- Windows 11 : Microsoft généralise le point-in-time restore pour accélérer la remise en service des PC
- Computex 2026 : 5 signaux forts à retenir
