Re: Self Join Help

Поиск
Список
Период
Сортировка
От apz
Тема Re: Self Join Help
Дата
Msg-id 3EA0EEED.1020404@nofate.com
обсуждение исходный текст
Ответ на Self Join Help  (Gerard Samuel <gsam@trini0.org>)
Ответы Re: Self Join Help  (apz <apz@nofate.com>)
Список 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 по дате отправления:

Предыдущее
От: Gerard Samuel
Дата:
Сообщение: Self Join Help
Следующее
От: apz
Дата:
Сообщение: Re: Self Join Help