可能重复:
Simplest way to do a recursive self-join in SQL Server?
我必须在SQL中创建一个包含项目/产品组的表。制作的每个新组都将在预定义组或之前形成的组之一下制作。我想将所有这些数据保存在SQL表中。到目前为止,我已经创建了一个这样的表:
但这只能指代下一个级别,我如何才能知道谁是这个群体的超级父母。
例如:
A, B, C
。 A
还有其他子组A1, A2, A3
。 A1
还有其他子组A11, A12, A13
。 我是否会从A
或A11
或A22
获得有关超级母群的信息,例如A33
?
如果问题不明确,请告诉我。
答案 0 :(得分:1)
假设T-SQL和MSSQLServer(您没有指定),并且假设您的Group
表看起来像这样:
Id | Name | ParentId
---+------+---------
1 | A | NULL
2 | B | NULL
3 | C | NULL
4 | A1 | 1
5 | A2 | 1
6 | A3 | 1
7 | A11 | 4
8 | A12 | 4
9 | A13 | 4
您可以使用以下递归CTE查找给定组的顶级,例如'A12':
WITH [Group](Id, Name, ParentId) AS
(
SELECT 1, 'A' , NULL UNION
SELECT 2, 'B' , NULL UNION
SELECT 3, 'C' , NULL UNION
SELECT 4, 'A1' , 1 UNION
SELECT 5, 'A2' , 1 UNION
SELECT 6, 'A3' , 1 UNION
SELECT 7, 'A11', 4 UNION
SELECT 8, 'A12', 4 UNION
SELECT 9, 'A13', 4
), q AS
(
SELECT
*
FROM
[Group]
WHERE
[Name] = 'A12' -- Given 'A12' as the child
UNION ALL
SELECT
g.*
FROM
[Group] g
JOIN
q
ON
q.ParentId = g.Id
)
SELECT
*
FROM
q
WHERE
ParentId IS NULL
此查询返回:
Id | Name | ParentId
---+------+---------
1 | A | NULL