Nested set model

Поиск
Список
Период
Сортировка
От Renato De Giovanni
Тема Nested set model
Дата
Msg-id 3B7DBE38.9F1FF640@viafractal.com.br
обсуждение исходный текст
Список pgsql-sql
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




В списке pgsql-sql по дате отправления:

Предыдущее
От: Oleg Lebedev
Дата:
Сообщение: Re: Nested JOINs - upgrade to 7.1.2
Следующее
От: "Bill"
Дата:
Сообщение: Function define question