pg.ddx.io  pgsql-sql@postgresql.org mailing list archive  
help / color / mirror / Atom feed
From: Julien Cigar <jcigar@ulb.ac.be>
To: pgsql-sql@postgresql.org
Subject: WITH RECURSIVE question
Date: Tue, 23 Aug 2011 12:03:43 +0200
Message-ID: <4E537AFF.8050006@ulb.ac.be> (raw)

Hello,

I have a classic parent -> child relation (id, container_id) and I would 
like to find the full hierarchy for a child, something like

   A
  / \
B   C
|
D

given D I want {A,B,C}

WITH RECURSIVE hierarchy(level, container_id, titles, containers) AS 
(SELECT 1 AS level, container_id, ARRAY[title::text] AS titles,
         ARRAY[container_id] AS containers
  FROM content
  WHERE id=984
UNION ALL
  SELECT hierarchy.level + 1, c.container_id,
         array_prepend(c.title::text, titles),
         array_prepend(c.container_id, containers)
  FROM content c
  JOIN hierarchy ON hierarchy.container_id = c.id
) SELECT titles, containers
   FROM hierarchy
   ORDER BY level DESC LIMIT 1;

which give me something like:

         titles        |  containers
----------------------+--------------
  {Home,Templates,IAS} | {NULL,1,983}
(1 row)

This is exactly what I want, but I wondered if there are better ways to 
do it? Is it scalable?

(The final idea is to put that in a trigger, so that it will be executed 
only when a new row is added, or when the row is moved from a container 
to another one ..)

Thanks,
Julien

-- 
No trees were killed in the creation of this message.
However, many electrons were terribly inconvenienced.

Attachments:

  [text/x-vcard] jcigar.vcf (290B, ../4E537AFF.8050006@ulb.ac.be/2-jcigar.vcf)
  download | inline:
begin:vcard
fn:Julien Cigar
n:Cigar;Julien
org;quoted-printable:Belgian Biodiversity Platform;ULB (Universit=C3=A9 Libre de Bruxelles)
adr:;;;Brussels;;;Belgium
email;internet:jcigar@ulb.ac.be
tel;work:+32(0)26505752
x-mozilla-html:FALSE
url:http://www.biodiversity.be
version:2.1
end:vcard

view thread (2+ messages)  latest in thread

Message-ID: <4E537AFF.8050006@ulb.ac.be>
Permalink:  ../4E537AFF.8050006@ulb.ac.be/
Also on:    postgresql.org/message-id/4E537AFF.8050006@ulb.ac.be

 · 

reply

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Reply to all the recipients using the --to and --cc options:
  reply via email

  To: pgsql-sql@postgresql.org
  Cc: jcigar@ulb.ac.be
  Subject: Re: WITH RECURSIVE question
  In-Reply-To: <4E537AFF.8050006@ulb.ac.be>

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

This inbox is served by DDX for PostgreSQL; see mirroring instructions
for how to clone and mirror all data and code used for this inbox