Re: Self Join Help - Mailing list pgsql-php

From apz
Subject Re: Self Join Help
Date
Msg-id 3EA0EEED.1020404@nofate.com
Whole thread Raw
In response to Self Join Help  (Gerard Samuel <gsam@trini0.org>)
Responses Re: Self Join Help  (apz <apz@nofate.com>)
List pgsql-php
Gerard Samuel wrote:
> Im trying to figure out Self Joins with PostgreSQL.  The output of the
> second SQL is correct, because of the where a.id = b.pid,
> but I would like to return all rows that are part of the tree.
> test=# select * from topics;
>        id        |       pid        | topicname
> ------------------+------------------+------------
> AFAdDFoAPNX6wKbr | 0                | Foo
> AFAdDFoAPgTi9tAE | 0                | Apache
> AFAdDFoAPgTjCa4V | AFAdDFoAPgTi9tAE | PHP
> AFAdDFoAPlv1ENRn | 0                | XHTML
> AFAdDFoAPoSEWZaq | 0                | News
> AFAdDFoAPoSEaRPV | AFAdDFoAPoSEWZaq | World News
> AFAdDFoAPoSEee5_ | AFAdDFoAPoSEWZaq | Tech News
> (7 rows)
>
> test=# select a.topicname as parent, b.topicname as child from topics as
> a, topics as b where a.id = b.pid;
> parent |   child
> --------+------------
> Apache | PHP
> News   | Tech News
> News   | World News
> (3 rows)

do you mean return also root nodes? You could just add

insert into topics (id, topicname) values (0, 'root');

and then you should be getting

test=# select a.topicname as parent, b.topicname as child from topics as
  a, topics as b where a.id = b.pid;

  parent |   child
--------+------------
  root   | Apache
  root   | News
  root   | Foo
  root   | XHTML
  Apache | PHP
  News   | Tech News
  News   | World News


or, if you dont want to add a ficticious root node you could do a left
join (if you can do left self joins, dont see a reason why not, but
never did it):

test=# select a.topicname as parent, b.topicname as child from topics as
a left join topics as b on a.id = b.pid;

  parent |   child
--------+------------
  XHTML  | null
  Foo    | null
  Apache | PHP
  News   | Tech News
  News   | World News


but then, your self referencing querry starts going into the idea of
recursive select statements. I have little knowledge in this, MS-SQL
does not have true recursive selects (you can string up bunch of left
joins, but its a workaround hack). Oracle and I think db2 do support
recursive selects, but only to a certain level (Oracle recurses up to
32levels I think), I wouldnt mind hearing how recursive Select would
work in your case:

    by recursive I mean I want to select all nodes who have a
    specific node above the tree (be it parent/grand parent/
    grand grand parent, etc).


/apz,   If your aim in life is nothing, you can't miss.


pgsql-php by date:

Previous
From: Gerard Samuel
Date:
Subject: Self Join Help
Next
From: apz
Date:
Subject: Re: Self Join Help