Thread

  1. RE: [HACKERS] Recursive queries?

    Michael Meskes <meskes@topsystem.de> — 1998-02-21T15:27:26Z

    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...
    >