Fwd: [SQL] Requête recursive

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>

In response to

Responses

Browse pgsql-fr-generale by date

  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