从SQL 2005中的自引用表获取分层数据

时间:2011-03-31 09:11:18

标签: sql-server-2005 hierarchical-data common-table-expression self-reference

我正在使用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

我已经看到了与此相关的各种其他问题,但无法看到我的问题的答案。最近的事情是oracle'先前连接',如果我使用的是oracle dB,这将是很棒的!有什么想法吗?

干杯, 杰森

1 个答案:

答案 0 :(得分:0)

我想我找到了答案,那就是我加入了锚定成员而不是研讨会。感谢gjvdkamp对于这个类似的帖子,这让我重新评估了错误的“真正的”sql语句。