Получение иерархических данных из самореферентной таблицы в SQL 2005 - PullRequest
1 голос
/ 31 марта 2011

Я использую SQL 2005 с существующими данными миллионов записей (поэтому структура данных не может быть изменена), и я пытаюсь сделать следующее:

У меня есть некоторые данные (следующий пример отеще один вопрос и немного изменен, чтобы показать, чего я пытаюсь достичь) в таблице, ссылающейся на себя.Мне нужно вытащить дерево результатов в следующем формате:

Parent
 Child1 of Parent
  Child1 of Child 1
  Child2 of Child 1
 Child2 of Parent
  Child1 of Child 2

Мои фактические данные углубляются на 9 уровней - и я попытался получить результат, используя CTE.Однако это приводит к следующему:

Parent
 Child1 of Parent
 Child2 of Parent
  Child1 of Child 1
  Child2 of Child 1
  Child1 of Child 2

Вот пример запроса, который я использую:

create table workshop (
w_id smallint primary key,
p_id smallint,
s_date smalldatetime,
title varchar(100))
go

alter table workshop add constraint fk_wkshp foreign key (p_id)
references workshop(w_id)
go

insert into workshop (w_id, p_id, s_date, title) values (1, null,
'5/2/2007', 'Parent')
insert into workshop (w_id, p_id, s_date, title) values (2, 1,
'5/3/2007', 'Child 1 of the parent')
insert into workshop (w_id, p_id, s_date, title) values (3, 1,
'5/5/2007', 'Child 2 of the parent')
insert into workshop (w_id, p_id, s_date, title) values (4, 2,
'5/4/2007', 'Child of Child 1')
insert into workshop (w_id, p_id, s_date, title) values (5, 2,
'5/5/2007', 'Child 2 of the child of the parent')
insert into workshop (w_id, p_id, s_date, title) values (6, 3,
'5/7/2007', 'Child of the child 2')
insert into workshop (w_id, p_id, s_date, title) values (7, null,
'5/7/2007', '2nd Parent')
insert into workshop (w_id, p_id, s_date, title) values (8, 7,
'5/7/2007', 'Child of 2nd Parent')
insert into workshop (w_id, p_id, s_date, title) values (9, 7,
'5/7/2007', 'Child of 2nd Parent')
go

declare @id smallint
set @id = 1

;with events (w_id, p_id, s_date, title)
as
(
-- the anchor member
select
w_id, p_id, s_date, title
from
workshop
where w_id = @id

-- the recursive member
union all

select
w.w_id, w.p_id, w.s_date, w.title
from
workshop w
-- the key is to join to the CTE
join events e on e.w_id = w.p_id
)

select * from events

drop table workshop
go

Я видел другие вопросы, относящиеся к этому, но не вижуответ на мою проблему.Непосредственной вещью является оракул «подключайся до», что было бы здорово, если бы я использовал оракул дБ!Есть идеи?

Приветствия, Джейсон

1 Ответ

0 голосов
/ 31 марта 2011

Я думаю, я нашел ответ, который я присоединялась на элементе анкера, а не на столе мастерской.Спасибо gjvdkamp за этот похожий пост, который заставил меня переоценить «настоящий» SQL-оператор, который был ошибочным.

...