I have a table that I created that implements a linked list. I am not an
expert SQL developer and was wondering if there are known ways to traverse
the linked lists. The table contains many linked lists based upon the head
of the list and I need to extract all of the nodes that make up a list. The
lists are simple with a item and a link to the history item so it goes kind
of like:
1, 0
3, 1
7, 3
9, 7
...
I missed "The table contains many linked lists", so wanted to do another
try. I guess there should be a better way, but what if you do this?
1)
Assuming your table has two columns (n int, p int), do
create table tmplist (n int, p int);
2)
drop function traverse(integer);
create or replace function traverse (integer)
returns integer as
$$
declare
x int;
begin
x := $1;
while x is not null loop
select n into x from linkedlist where p = x;
insert into tmplist (select * from links where p=x);
-- or do any processing
end loop;
return 1 ;
end;
$$
language plpgsql;
3)
select traverse(0);
select * from tmplist;
0 - 1 - 4 - 8 - 12 ...
delete from tmplist;
select traverse(2);
select * from tmplist;
2 - 3 - 5 - 6 - ...
(where 0 or 2 is the heads of the linked lists in the table, which you
want to traverse)
I'd appreciate any insight if there's a better way but somehow it was not
possible to return setof int from within while loop whereas it was
possible from within a for loop. I didn't find a way to deliver the
templist table name as argument. (Somehow there seemed to be a bug(?)
there)
Regards,
Ben K.
Developer
http://benix.tamu.edu
---------------------------(end of broadcast)---------------------------
TIP 3: Have you checked our extensive FAQ?
http://www.postgresql.org/docs/faq