Hi,
I'm trying the "nested set model" to handle a tree structure in a
database (reference: http://www.dbmsmag.com/9603d06.html). It has many
advantages if you want to select all nodes above or below a specific
node (recursive calls aren't necessary), but when you want to select
only the first generation under a node, the query I found was a lot more
complex than it would be if using the traditional adjacency model.
Considering this example:
CREATE TABLE skill (key INTEGER NOT NULL,name VARCHAR(50) NOT NULL,left_n INTEGER NOT NULL,right_n
INTEGERNOT NULL,PRIMARY KEY (key),CHECK (left_n > 0 AND right_n > left_n)
);
insert into skill values (1 , 'Skills' , 1, 30);
insert into skill values (2 , 'Computing' , 2, 29);
insert into skill values (3 , 'Programming', 3, 10);
insert into skill values (4 , 'C++' , 4, 5);
insert into skill values (5 , 'Java' , 6, 7);
insert into skill values (6 , 'Prolog' , 8, 9);
insert into skill values (7 , 'Database' , 11, 18);
insert into skill values (8 , 'Oracle' , 12, 13);
insert into skill values (9 , 'PostgreSQL' , 14, 15);
insert into skill values (10, 'Solid' , 16, 17);
insert into skill values (11, 'Design' , 19, 28);
insert into skill values (12, 'CorelDraw' , 20, 21);
insert into skill values (13, 'Illustrator', 22, 23);
insert into skill values (14, 'Photoshop' , 24, 25);
insert into skill values (15, 'The Gimp' , 26, 27);
How could we select, for example, only the nodes immediately under
"computing"?
The only way I could do it was using:
select son.key, son.name, son.left_n
from skill son, skill parent
where parent.key = 2
and son.left_n between parent.left_n and parent.right_n
and son.key <> parent.key
and son.key not in(select son_descendents.keyfrom skill parent, skill son, skill son_descendentswhere parent.key = 2and
son.left_nbetween parent.left_n and parent.right_nand son.key <> parent.keyand son_descendents.left_n between
son.left_nand son.right_nand son.key <> son_descendents.key)
order by son.left_n ;
Isn't there an easier way to achieve this?? With the usual adjacency
model the query would look trivial! Something like:
select son.key, son.name
from skill son
where son.parent = 2 ;
Well, thanks in advance!
--
Renato
Sao Paulo - SP - Brasil
rdg@viafractal.com.br