Re: Self Join Help

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]



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.



[Index of Archives]     [Postgresql General]     [Postgresql Admin]     [PHP Users]     [PHP Home]     [PHP on Windows]     [Kernel Newbies]     [PHP Classes]     [PHP Databases]     [Yosemite Backpacking]     [Postgresql Jobs]

  Powered by Linux