首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用SQL Server CTE返回所有父记录

使用SQL Server CTE返回所有父记录
EN

Stack Overflow用户
提问于 2012-11-21 13:37:11
回答 1查看 2.8K关注 0票数 3

我有下面的表类层次结构。

代码语言:javascript
复制
ClassID    ParentID
--------------------
PMM_00001  null
PMM_00010  PMM_00001
PMM_00110  PMM_00010
PMM_00020  PMM_00001
PMM_00220  PMM_00020

我想要得到以下结果。

代码语言:javascript
复制
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来获得这些结果。

这是我到目前为止所尝试过的。

代码语言:javascript
复制
;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

我从这里得到的结果只是简单地向下遍历层次结构,以获得完整的列表。我需要获取对层次结构中每个级别的引用,这样才能获得完整的特征列表。如有任何帮助,我们不胜感激!如果有更好的方法做这件事,我愿意接受建议。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-11-21 21:42:34

看起来我搞错了。我遗漏的概念是,我需要在层次结构中向上移动,而不是向下移动(正如大多数文档/文章所展示的那样)。这就是我所做的。

代码语言:javascript
复制
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

返回..。

代码语言:javascript
复制
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

SQLfiddle以供参考。

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13487006

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档