如何在SQLServer中递归地获取值?

j1dl9f46  于 2021-07-24  发布在  Java
关注(0)|答案(1)|浏览(519)

我有下面的样本数据。

IF OBJECT_ID('tempdb..#tempData1') IS NOT NULL 
     DROP TABLE #tempData1

CREATE TABLE #tempData1
(
     ParentItemId varchar(20),
     ChildItemId varchar(20)
)

INSERT INTO #tempData1 VALUES('2000-194-819','2000-212-595')
INSERT INTO #tempData1 VALUES('2000-212-771','2000-212-704')
INSERT INTO #tempData1 VALUES('2000-212-704','2000-212-705')
INSERT INTO #tempData1 VALUES('2000-212-595','2000-211-801')
INSERT INTO #tempData1 VALUES('2000-212-801','2000-211-578')

我想找到 ParentItemId 以及它的孩子们

WHERE ParentItemId = '2000-194-819'

我写了这个问题:

SELECT B1.ParentItemID 
FROM #tempData1 B1 
WHERE NOT EXISTS (SELECT B2.ParentItemID 
                  FROM #tempData1 B2 
                  WHERE B2.ParentItemID = B2.ChildItemId)
  AND ParentItemID = '2000-194-819'

电流输出:

'2000-194-819'

预期产量:

2000-194-819
2000-212-595
2000-212-801

请帮忙。

k97glaaz

k97glaaz1#

可以使用递归cte。例如:

with
n as (
  select ParentItemId, ChildItemId 
  from #tempData1 
  where ParentItemID = '2000-194-819'
 union all
  select d.ParentItemId, d.ChildItemId
  from n 
  join #tempData1 d on d.ParentItemId = n.ChildItemId
)
select * from n

递归cte由两部分组成:
cte的第一部分(锚定成员)位于 UNION ALL 子句并检索第一组行;这是出发点:

select ParentItemId, ChildItemId 
 from #tempData1 
 where ParentItemID = '2000-194-819'

cte的第二部分(递归成员)放在 UNION ALL 条款。此部分对检索到的新行迭代执行,直到不再返回任何行为止。这样你就可以像我们在这里做的那样,走一个图。

select d.ParentItemId, d.ChildItemId
 from n 
 join #tempData1 d on d.ParentItemId = n.ChildItemId

相关问题