From: | Frederic Gaerel <frederic(dot)gaerel(at)chronopost(dot)fr> |
---|---|
To: | pgsql-fr-generale <pgsql-fr-generale(at)postgresql(dot)org> |
Subject: | Fwd: [SQL] Requête recursive |
Date: | 2014-09-22 13:04:33 |
Message-ID: | CACKqRo83tsr30Q947nfNt1aLbKQ4YaSMH+kXzZqB-9fVuh=xcw@mail.gmail.com |
Views: | Whole Thread | Raw Message | Download mbox | Resend email |
Thread: | |
Lists: | pgsql-fr-generale |
Ma propre réponse :
WITH RECURSIVE branches( code_maitre, code, parents) AS (
SELECT S.code_maitre,
S.code,
ARRAY[]::INTEGER[] AS "array"
FROM site S
WHERE S.code_maitre IS NULL
UNION ALL
SELECT S.code_maitre,
S.code,
CASE
WHEN b.parents @> ARRAY[S.code_maitre] THEN b.parents
ELSE b.parents || ARRAY[S.code_maitre]
END AS "case"
FROM site S,
branches b
WHERE b.code = S.code_maitre
)
SELECT DT.code,
enfant
FROM (
SELECT UNNEST(B.parents) code,
B.code enfant
FROM branches B
) DT
ORDER BY 1,2;
Si vous voyez plus simple, je suis preneur.
Cordialement.
Frédéric GAËREL
Chef de Projets Transport
Direction des Systèmes d'Information
CHRONOPOST INTERNATIONAL
Tél Fixe : (+33) 01 74 22 82 22
Email: frederic(dot)gaerel(at)chronopost(dot)fr <arnaud(dot)courtois(at)chronopost(dot)fr>
---------- Message transféré ----------
De : Frederic Gaerel <frederic(dot)gaerel(at)chronopost(dot)fr>
Date : 22 septembre 2014 13:50
Objet : [SQL] Requête recursive
À : pgsql-fr-generale(at)postgresql(dot)org
Bonjour à tous.
J'ai une table de sites organisés hiérarchiquement comme suit :
CREATE TABLE site
(
code INTEGER NOT NULL,
nom TEXT NOT NULL,
code_maitre INTEGER -- NULL uniquement pour le site au sommet
)
Chaque site ayant un lien vers son "père" via la colonne code_maitre
Via la requête suivante j'obtiens bien les "aïeux" d'un site (père, grand
père, etc.)
WITH RECURSIVE branches( code, parents) AS (
SELECT code,
ARRAY[]::INTEGER[] AS "array"
FROM site
WHERE code_tracking_maitre IS NULL
UNION ALL
SELECT S.S.code,
CASE
WHEN b.parents @> ARRAY[S.code_maitre] THEN b.parents
ELSE b.parents || ARRAY[S.code_maitre]
END AS "case"
FROM site S,
branches b
WHERE b.code = S.code_maitre
)
SELECT *
FROM branches
Je ne parviens pas à "inverser" ma requête pour obtenir la liste des
"descendants" d'un site (enfants, petits enfants, etc..)
Merci de votre aide
Cordialement.
Frédéric GAËREL
Chef de Projets Transport
Direction des Systèmes d'Information
CHRONOPOST INTERNATIONAL
Tél Fixe : (+33) 01 74 22 82 22
Email: frederic(dot)gaerel(at)chronopost(dot)fr <arnaud(dot)courtois(at)chronopost(dot)fr>
From | Date | Subject | |
---|---|---|---|
Next Message | Cédric Villemain | 2014-09-22 14:07:16 | Re: Fwd: [SQL] Requête recursive |
Previous Message | Frederic Gaerel | 2014-09-22 11:50:43 | [SQL] Requête recursive |