Joe*_*tch 3 sql sql-server sql-server-2005 common-table-expression
我有以下表类层次结构.
ClassID ParentID
--------------------
PMM_00001 null
PMM_00010 PMM_00001
PMM_00110 PMM_00010
PMM_00020 PMM_00001
PMM_00220 PMM_00020
Run Code Online (Sandbox Code Playgroud)
我希望得到以下结果.
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
Run Code Online (Sandbox Code Playgroud)
我计划通过加入我的特征表来使用这些结果来获得继承的特征.在过去,我使用循环来正确设置数据,但我想使用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
Run Code Online (Sandbox Code Playgroud)
我从中获得的结果只是沿着层次结构向下走,以获得完整的列表.我需要将引用返回到层次结构中的每个级别,以便我可以获得完整的特征列表.任何帮助表示赞赏!如果有更好的方法,我愿意接受建议.
看起来我接近这一切都错了.我缺少的概念是我需要向上移动层次结构,而不是向下移动(因为大多数文档/文章都在那里演示).所以这就是我做的.
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
Run Code Online (Sandbox Code Playgroud)
返回...
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 2
Run Code Online (Sandbox Code Playgroud)
SQLfiddle供参考.