反向递归CTE以查找父值

时间:2016-12-19 15:02:17

标签: sql-server sql-server-2008

我有以下父样子数据样本。

declare @tab table (Item varchar(10),Parent varchar(10),Priority int)

insert into @tab
SELECT 'A',NULL,3,0
UNION ALL
SELECT 'A1','A',2,1
UNION ALL
SELECT 'A2','A',2,1
UNION ALL
SELECT 'A11','A1',2,2
UNION ALL
SELECT 'A12','A1',1,2
UNION ALL
SELECT 'A21','A2',3,2
UNION ALL
SELECT 'A22','A2',2,2

select * from @tab

现在我需要反向遍历(Leaf节点到后续父节点)以根据其所有子节点的最低优先级设置其后续父节点优先级。

例如,对于儿童A11和A12,最低优先级为1,并且应为A1设置1。 儿童A21和A22的最低优先级为2,而A2应设为2。 现在A1的优先级是1 A2优先级为2

同样,对于儿童A1和A2,最低优先级为1,并且应为A设置为1。

如此预期的输出如下。

SELECT 'A',NULL,1,0
UNION ALL
SELECT 'A1','A',1,1
UNION ALL
SELECT 'A2','A',2,1
UNION ALL
SELECT 'A11','A1',2,2
UNION ALL
SELECT 'A12','A1',1,2
UNION ALL
SELECT 'A21','A2',3,2
UNION ALL
SELECT 'A22','A2',2,2

请指导我如何操作。

提前致谢

2 个答案:

答案 0 :(得分:0)

这是解决方案

declare @tab table (Item varchar(10),Parent varchar(10),Priority int)


insert into @tab
SELECT 'A',NULL,3
UNION ALL
SELECT 'A1','A',2
UNION ALL
SELECT 'A2','A',2
UNION ALL
SELECT 'A11','A1',2
UNION ALL
SELECT 'A12','A1',1
UNION ALL
SELECT 'A21','A2',3
UNION ALL
SELECT 'A22','A2',2


;WITH RCTE AS
(
SELECT Item , Parent , Priority ,  1 AS Level
FROM @tab
WHERE Parent IS NULL

UNION ALL

SELECT Child.Item , Child.Parent , Child.Priority , Level+1
FROM @tab Child
INNER JOIN RCTE Parent
ON Parent.Item = Child.Parent

)

SELECT * FROM RCTE

答案 1 :(得分:0)

我不知道你的联合所有查询中的最后一个字段是什么,所以我将其排除在外。

答案很简单,请查看上一个查询。

create table #tab (Item varchar(10),Parent varchar(10), Priority int)


insert into #tab 
SELECT 'A',NULL,3
UNION ALL
SELECT 'A1','A',1
UNION ALL
SELECT 'A2','A',2
UNION ALL
SELECT 'A11','A1',2
UNION ALL
SELECT 'A12','A1',1
UNION ALL
SELECT 'A21','A2',3
UNION ALL
SELECT 'A22','A2',2


SELECT 
    Item , 
    Parent , 
    coalesce((select min(Priority) from #tab b where b.parent  = a.item),a.priority) as [priority]
FROM 
    #tab a 
相关问题