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