0

我有只有一列的表 RD:

-----
rd_id
-----
3 
2 
6 
7 
8 

我有两列的表 DL,这个表上存储了层次结构:

----------------------
dl_id     dl_parent
----------------------
1         2               
2         Null
3         Null
4         6
6         7
7         8
8         Null

现在的问题是如何使用 RD 表的成员从 DL 表中获取层次结构。结果将是:

--------------
rd_id   dl_id
--------------
3         3

2         2

6         6
6         7
6         8

7         7
8         8

8         8

从星期五开始,我一直在努力解决这个问题,但仍然无法解决它。我知道我可以使用公用表表达式从一个值遍历递归(例如,使用输入 6 创建一个函数并产生 6、7、8)。但我不知道如何使用多个值(rd_id)。

有什么想法吗?

4

2 回答 2

1

这会产生正确的结果。数据设置:

declare @RD table (rd_id int not null)
insert into @RD(rd_id) values
(3),
(2),
(6),
(7),
(8)

declare @DL table (dl_id int not null,dl_parent int null)
insert into @DL(dl_id,dl_parent) values
(1,2),          
(2,Null),
(3,Null),
(4,6),
(6,7),
(7,8),
(8,Null)

和查询:

;with AllValues as (
    select rd_id,rd_id as dl_id from @RD
    union all
    select rd_id,dl_parent
    from AllValues av
        inner join
        @DL dl
            on
                av.dl_id = dl.dl_id
    where
        dl.dl_parent is not null
)
select * from AllValues

结果:

rd_id       dl_id
----------- -----------
3           3
2           2
6           6
7           7
8           8
7           8
6           7
6           8

解释:

在 CTE 的锚点中,我们只需rd_id@RD表中选择两次 - 因为您的样本暗示每个输入行都应该在两列中产生具有相同值的输出行。

@DL然后,我们根据第二列连接到表中我们可以找到的任何匹配的父行。如果我们找到一个父项,那么我们生成一个新行,将父项值代入第二列。这一直持续到没有新的行产生。

于 2012-09-17T09:23:17.857 回答
0

您必须使用动态视图来创建递归查询,如下所示:

with n as (
select dl_id, dl_id as ancestor
from dbo.dl
union all
select np1.dl_id, n.ancestor
from dl as np1 , n
where n.dl_id = np1.dl_parent)
select * from n
where dl_id in (select rd_id from rd)
order by dl_id, ancestor
于 2012-09-17T09:26:27.170 回答