我有下面的表类层次结构。
ClassID ParentID
--------------------
PMM_00001 null
PMM_00010 PMM_00001
PMM_00110 PMM_00010
PMM_00020 PMM_00001
PMM_00220 PMM_00020我想要得到以下结果。
ClassID Class_Join
---------------------
PMM_00001 PMM_00001
PMM_00010 PMM_00001
PMM_00010 PMM_00010
PMM_00110 PMM_00001
PMM_00110 PMM_00010
PMM_00110 PMM_00110
PMM_00020 PMM_00001
PMM_00020 PMM_00020
PMM_00220 PMM_00001
PMM_00220 PMM_00020
PMM_00220 PMM_00220我计划使用这些结果通过连接到我的特征表来获得继承的特征。在过去,我使用循环来正确设置数据,但我想使用CTE来获得这些结果。
这是我到目前为止所尝试过的。
;WITH ClassHierarchy_CTE (ClassID, ClassID_Join)
AS
(
SELECT
c.ClassID,
c.ClassID
FROM
ClassHierarchy AS h
WHERE
h.ParentID IS NULL
UNION ALL
SELECT
c.ClassID,
h.ParentID
FROM
ClassHierarchy AS h INNER JOIN ClassHierarchy_CTE
ON
h.ParentID = ClassHierarchy_CTE.ClassID
)
SELECT
*
FROM
ClassHierarchy_CTE
ORDER BY
ClassID我从这里得到的结果只是简单地向下遍历层次结构,以获得完整的列表。我需要获取对层次结构中每个级别的引用,这样才能获得完整的特征列表。如有任何帮助,我们不胜感激!如果有更好的方法做这件事,我愿意接受建议。
发布于 2012-11-21 21:42:34
看起来我搞错了。我遗漏的概念是,我需要在层次结构中向上移动,而不是向下移动(正如大多数文档/文章所展示的那样)。这就是我所做的。
CREATE TABLE hierarchy
(
ClassID nvarchar(100), ParentID nvarchar(100)
)
INSERT INTO hierarchy
( ClassID , ParentID)
VALUES
( N'PMM_00001', NULL ),
( N'PMM_00010', N'PMM_00001'),
( N'PMM_00110', N'PMM_00010'),
( N'PMM_00020', N'PMM_00001'),
( N'PMM_00220', N'PMM_00020')
;WITH ClassHierarchy_CTE (ClassID, ClassID_Join, Level)
AS
(
SELECT
ClassID,
ClassID AS Join_Class,
0
FROM
hierarchy AS c
UNION ALL
SELECT
cte.ClassID,
h.ParentID,
Level + 1
FROM
hierarchy AS h INNER JOIN ClassHierarchy_CTE as cte
ON
h.ClassID = cte.ClassID_Join
)
SELECT
*
FROM
ClassHierarchy_CTE
WHERE
ClassID_Join IS NOT NULL
ORDER BY
ClassID,
Level返回..。
CLASSID CLASSID_JOIN LEVEL
---------------------------------
PMM_00001 PMM_00001 0
PMM_00010 PMM_00010 0
PMM_00010 PMM_00001 1
PMM_00020 PMM_00020 0
PMM_00020 PMM_00001 1
PMM_00110 PMM_00110 0
PMM_00110 PMM_00010 1
PMM_00110 PMM_00001 2
PMM_00220 PMM_00220 0
PMM_00220 PMM_00020 1
PMM_00220 PMM_00001 2SQLfiddle以供参考。
https://stackoverflow.com/questions/13487006
复制相似问题