一尘不染

如何从表中选择层次结构中的最低级别

sql

我有一个具有父/子关系的表:

Table A
Column Id int
Column Parent_Id int
Column Description text

一组示例数据为:

999, NULL, 'Corp.'
998, 999, 'Div1',
997, 999, 'Div2', 
510, 998, 'Child Div1A',
110, 997, 'Child Div2A',
120, 997, 'Child Div2B',

我的查询需要返回给定父级的最小子级集。因此,例如,如果给定999,我将返回510、110、120。但是给定997,我将仅返回110和120。如果给定110,则什么也不会返回。我无法弄清楚如何正确格式化查询。我首先对表进行JOIN-
ing操作,但是当我实际上需要将N级降低时,这似乎只会使我降低1级。


阅读 138

收藏
2021-05-23

共1个答案

一尘不染

Declare @t Table(ID int,Parent_ID int,Description varchar(20))

insert into @t values(999, NULL, 'Corp.')
insert into @t values(998, 999, 'Div1')
insert into @t values(997, 999, 'Div2')
insert into @t values(510, 998, 'Child Div1A')
insert into @t values(110, 997, 'Child Div2A')
insert into @t values(120, 997, 'Child Div2B')

;WITH Rollups AS (
    SELECT Id, Parent_Id, Description 
    FROM @t WHERE ID = 999
    UNION ALL
    SELECT parent.Id, parent.Parent_Id, child.Description
    FROM @t parent 
    INNER JOIN Rollups child ON child.Id = parent.Parent_Id
)
SELECT *
FROM Rollups
Where not Exists(Select * from @t where Parent_Id=Rollups.ID)
2021-05-23