2 pièce(s) jointe(s)
WITH RECURSIVE PATH QUERY
Bonjour
J'ai un souci avec la génération du chemin de l'arbre (cf. path dans la doc postgres).
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
|
CREATE TABLE domaine (
id CHAR(25) NOT NULL,
nom CHAR(35) NULL,
parent CHAR(25) NULL,
PRIMARY KEY(id),
FOREIGN KEY(parent)REFERENCES Domaine(id)
ON DELETE CASCADE
ON UPDATE CASCADE
);
insert into domaine values ('1', 'pA', null);
insert into domaine values ('2', 'pB', '2');
insert into domaine values ('11', 'eA1', '1');
insert into domaine values ('12', 'eA2', '1');
insert into domaine values ('13', 'eA3', '1');
insert into domaine values ('21', 'eB1', '2');
insert into domaine values ('22', 'eB2', '2');
insert into domaine values ('23', 'eB3', '2');
insert into domaine values ('11-1', 'eeA1', '11');
insert into domaine values ('11-2', 'eeA1', '11'); |
Ensuite la requête basique fonctionne :
Code:
1 2 3 4 5 6 7 8 9 10 11
|
WITH recursive enfant(idEnfant,nomEnfant,level) AS
(
SELECT d.id,d.nom,1
FROM domaine d WHERE d.id='1'
union all
SELECT d.id,d.nom,(e.level+1)
FROM domaine d,enfant e
WHERE d.parent=e.idEnfant
)
SELECT * FROM enfant ORDER BY level; |
le résultat est dans la PJ resRecOK.png.
par contre je n'arrive pas à faire fonctionner la requête inspirée de la doc PostgreSql, et intégrant la génération du chemin :
Code:
1 2 3 4 5 6 7 8 9 10
| WITH recursive enfant(idEnfant,nomEnfant,level, path, cycle) AS
(
SELECT d.id,d.nom,1 , ARRAY[d.id ], false
FROM domaine d WHERE d.id='1'
union all
SELECT d.id,d.nom,(e.level+1), path ||d.id , d.id=ANY(path)
FROM domaine d, enfant e
WHERE d.parent=e.idEnfant
)
SELECT * FROM enfant ORDER BY level; |
L'erreur est :
Citation:
ERROR: recursive query "enfant" column 4 has type character(25)[] in non-recursive term but type bpchar[] overall
LINE 3: SELECT d.id,d.nom,1 , ARRAY[d.id ], false
^
HINT: Cast the output of the non-recursive term to the correct type.
cf. la PJ : resRecKO.png
Je dois mal utiliser le type ARRAY, pouvez-vous m'éclairer ?