Citation :
5.1.2 Récursion
Nous allons maintenant voir comment fonctionne la récursivité au sein de SQL...
Pour cela construisons notre jeu d'essais :
CREATE TABLE T_VOLS_VLS
(VLS_ID INTEGER NOT NULL PRIMARY KEY,
VLS_REF CHAR(6) NOT NULL,
VLS_DEPART VARCHAR(16),
VLS_ARRIVEE VARCHAR(16)) INSERT INTO T_VOLS_VLS VALUES (1, 'AF714', 'PARIS', 'MARSEILLE')
INSERT INTO T_VOLS_VLS VALUES (2, 'AL908', 'PARIS', 'LYON')
INSERT INTO T_VOLS_VLS VALUES (3, 'AF321', 'PARIS', 'BORDEAUX')
INSERT INTO T_VOLS_VLS VALUES (4, 'AF978', 'BORDEAUX', 'MARSEILLE')
INSERT INTO T_VOLS_VLS VALUES (5, 'AL478', 'BORDEAUX', 'NICE')
INSERT INTO T_VOLS_VLS VALUES (6, 'AL974', 'NICE', 'LYON')
INSERT INTO T_VOLS_VLS VALUES (7, 'AL451', 'BORDEAUX', 'LILLE')
INSERT INTO T_VOLS_VLS VALUES (8, 'AF158', 'MARSEILLE', 'LYON')
INSERT INTO T_VOLS_VLS VALUES (9, 'AF159', 'MARSEILLE', 'BORDEAUX')
INSERT INTO T_VOLS_VLS VALUES (10, 'AF189', 'LYON', 'NICE')
INSERT INTO T_VOLS_VLS VALUES (11, 'AL458', 'NICE', 'PARIS')
INSERT INTO T_VOLS_VLS VALUES (12, 'AL117', 'MARSEILLE', 'PARIS')
INSERT INTO T_VOLS_VLS VALUES (13, 'AL444', 'BORDEAUX', 'LYON')
INSERT INTO T_VOLS_VLS VALUES (14, 'AL400', 'BORDEAUX', 'NANTES')
INSERT INTO T_VOLS_VLS VALUES (15, 'AF601', 'LYON', 'NANTES')
Le but est de trouver s'il est possible det se rendre, par exemple de PARIS à NANTES ou bien de NICE à BORDEAUX...
WITH RECURSIVE trajet (depart, arrivee)
AS (SELECT VLS_DEPART, VLS_ARRIVEE
FROM T_VOLS_VLS
UNION ALL
SELECT debut.depart, suite.VLS_ARRIVEE
FROM trajet debut
INNER JOIN T_VOLS_VLS suite
ON debut.arrive = suite.VLS_DEPART)
SELECT *
FROM trajet
WHERE depart = 'NICE'
AND arrivee = 'BORDEAUX'
En fait le travail de circulation dans l'arbre se fait dans la clause WITH RECURSIVE. L'expression principale de requête n'est là que pour filtrer les résultats.
Lors du premier cycle, les données sont les suivantes :
depart arrivee
---------------- ---------------- BORDEAUX BORDEAUX
BORDEAUX LILLE
BORDEAUX LYON
BORDEAUX LYON
BORDEAUX LYON
BORDEAUX MARSEILLE
BORDEAUX NANTES
BORDEAUX NANTES
BORDEAUX NICE
BORDEAUX NICE
BORDEAUX PARIS
BORDEAUX PARIS
LYON LYON
LYON NANTES
LYON NICE
LYON PARIS
MARSEILLE BORDEAUX
MARSEILLE BORDEAUX
MARSEILLE LILLE
MARSEILLE LYON
MARSEILLE LYON
MARSEILLE LYON
MARSEILLE MARSEILLE
MARSEILLE MARSEILLE
MARSEILLE NANTES
MARSEILLE NANTES
MARSEILLE NICE
MARSEILLE NICE
MARSEILLE PARIS
NICE BORDEAUX
NICE LYON
NICE LYON
NICE MARSEILLE
NICE NANTES
NICE NICE
NICE PARIS
PARIS BORDEAUX
PARIS BORDEAUX
PARIS LILLE
PARIS LYON
PARIS LYON
PARIS LYON
PARIS MARSEILLE
PARIS MARSEILLE
PARIS NANTES
PARIS NANTES
PARIS NICE
PARIS NICE
PARIS PARIS
Nous avons en fait tous les trajets possibles directs ou avec une escale. A notez que si nous avions utilisé UNION au lieu de UNION ALL nous aurions eût moins de résultats, en fait 31 au lieu de 49, cela aurait signifié que nous nous fichons de savoir quelle est la ville étpae de l'escale !
Lors du second cycle les données sont :
depart arrivee
---------------- ---------------- BORDEAUX BORDEAUX
BORDEAUX BORDEAUX
BORDEAUX BORDEAUX
BORDEAUX LILLE
BORDEAUX LILLE
BORDEAUX LYON
BORDEAUX LYON
BORDEAUX LYON
BORDEAUX LYON
BORDEAUX LYON
BORDEAUX LYON
BORDEAUX LYON
BORDEAUX MARSEILLE
BORDEAUX MARSEILLE
BORDEAUX MARSEILLE
BORDEAUX MARSEILLE
BORDEAUX NANTES
BORDEAUX NANTES
BORDEAUX NANTES
BORDEAUX NANTES
BORDEAUX NANTES
BORDEAUX NICE
BORDEAUX NICE
BORDEAUX NICE
BORDEAUX NICE
BORDEAUX NICE
BORDEAUX PARIS
BORDEAUX PARIS
BORDEAUX PARIS
LYON BORDEAUX
LYON LYON
LYON LYON
LYON MARSEILLE
LYON NANTES
LYON NANTES
LYON NICE
LYON NICE
LYON PARIS
MARSEILLE BORDEAUX
MARSEILLE BORDEAUX
MARSEILLE BORDEAUX
MARSEILLE BORDEAUX
MARSEILLE LILLE
MARSEILLE LILLE
MARSEILLE LYON
MARSEILLE LYON
MARSEILLE LYON
MARSEILLE LYON
MARSEILLE LYON
MARSEILLE LYON
MARSEILLE LYON
MARSEILLE LYON
MARSEILLE MARSEILLE
MARSEILLE MARSEILLE
MARSEILLE MARSEILLE
MARSEILLE NANTES
MARSEILLE NANTES
MARSEILLE NANTES
MARSEILLE NANTES
MARSEILLE NANTES
MARSEILLE NICE
MARSEILLE NICE
MARSEILLE NICE
MARSEILLE NICE
MARSEILLE NICE
MARSEILLE PARIS
MARSEILLE PARIS
MARSEILLE PARIS
MARSEILLE PARIS
MARSEILLE PARIS
NICE BORDEAUX
NICE BORDEAUX
NICE LILLE
NICE LYON
NICE LYON
NICE LYON
NICE LYON
NICE LYON
NICE MARSEILLE
NICE MARSEILLE
NICE NANTES
NICE NANTES
NICE NANTES
NICE NICE
NICE NICE
NICE NICE
NICE PARIS
NICE PARIS
NICE PARIS
PARIS BORDEAUX
PARIS BORDEAUX
PARIS BORDEAUX
PARIS BORDEAUX
PARIS LILLE
PARIS LILLE
PARIS LYON
PARIS LYON
PARIS LYON
PARIS LYON
PARIS LYON
PARIS LYON
PARIS LYON
PARIS LYON
PARIS MARSEILLE
PARIS MARSEILLE
PARIS MARSEILLE
PARIS MARSEILLE
PARIS NANTES
PARIS NANTES
PARIS NANTES
PARIS NANTES
PARIS NANTES
PARIS NICE
PARIS NICE
PARIS NICE
PARIS NICE
PARIS NICE
PARIS PARIS
PARIS PARIS
PARIS PARIS
PARIS PARIS
|