Let's say you have a parent relations as (parent, child). Now you want
to compute all ancestors from this relation that is technically spoken
you need a transitive closure.

In logic this looks like:

ancestor(X,Y) :- parent(X,Y).
ancestor(X,Y) :- ancestor(X,Z), parent(Z,Y).

X is ancestor of Y if X is parent of Y or X is ancestor of Z who is
parent of Y.

In POSTQUEL this is written like this (note I'm not sure about correct
POSTQUEL syntax):

retrieve into ancestor(p.x,p.y) from p in parent

retrieve* into ancestor(a.x,p.y) from a in ancestor, p in parent where
a.y=p.x.

You see the second line generates new tuples every time it's executed
until there is no more data deductable.

Michael
--
Dr. Michael Meskes, Projekt-Manager    | topystem Systemhaus GmbH
meskes@topsystem.de                    | Europark A2, Adenauerstr. 20
meskes@debian.org                      | 52146 Wuerselen
Go SF49ers! Use Debian GNU/Linux!      | Tel: (+49) 2405/4670-44

> ----------
> From: 	Thomas G. Lockhart[SMTP:lockhart@alumni.caltech.edu]
> Sent: 	Freitag, 20. Februar 1998 17:44
> To: 	Meskes, Michael
> Cc: 	'Vadim B. Mikheev'; PostgreSQL Hacker
> Subject: 	Re: [HACKERS] Recursive queries?
> 
> > But such a statement is executed only once, isn't it?
> >
> > Postquel did execute a retrieve* into as long as it was able to
> generate
> > new data.
> 
> OK, I'll bite :)
> Can you give an example of this? How does new data become available in
> the
> middle of a transaction? Just curious...
> 

Sat, 21 Feb 1998 16:27:26 +0100
"Meskes, Michael" <meskes@topsystem.de>
RE: [HACKERS] Recursive queries?