【问题标题】:Use SQL Server CTE to return all Parent Records使用 SQL Server CTE 返回所有父记录
【发布时间】:2012-11-21 05:37:11
【问题描述】:

我有下表类层次结构。

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

我从中得到的结果只是沿着层次结构向下走以获得完整列表。我需要将引用返回到层次结构中的每个级别,以便获得完整的特征列表。任何帮助表示赞赏!如果有更好的方法,我愿意接受建议。

【问题讨论】:

    标签: sql sql-server sql-server-2005 common-table-expression


    【解决方案1】:

    看起来我在处理这一切都错了。我缺少的概念是我需要将层次结构 UP 移动,而不是 DOWN(正如大多数文档/文章所展示的那样)。所以这就是我所做的。

    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   2
    

    SQLfiddle 供参考。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-05-19
      • 2023-03-23
      相关资源
      最近更新 更多