如何在T-SQL中使用递归CTE获得完整的层次结构?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何在T-SQL中使用递归CTE获得完整的层次结构?相关的知识,希望对你有一定的参考价值。

表格:

+-----+------------+-------------+
| Id  | DocumentNo | ParentCCID  |
+-----+------------+-------------+
|  10 | CC001      | NULL        |
|  20 | CC002      | CC001       |
|  33 | CC003      | CC002       |
+-----+-------------+-------------+

传递给查询的值:CC002

预期输出:

CC003
CC002
CC001

以下查询仅使您获得在层次结构中置于较高位置的记录:

;WITH cte AS (
        SELECT Id,
            documentno,
            DocumentTypeID,
            ParentCCID
        FROM basicdetails
        WHERE DocumentNo = 'CC#000056'

        UNION ALL

        SELECT R.Id,
            R.DocumentNo,
            R.DocumentTypeID,
            R.ParentCCID
        FROM basicdetails R
        JOIN cte P ON P.ParentCCID = R.DocumentNo
        )

SELECT Id,
    documentno,     
    ParentCCID
FROM cte
ORDER BY 1 DESC

注意:DocumentNo是唯一的主键。如果没有父记录,则ParentCCID可以为空值。

create table basicdetails
  (
    id int identity,
    documentno varchar(30),
    parentccid varchar(30)
  )
    insert into basicdetails values('CC001', null)
    insert into basicdetails values('CC002', 'CC001')
    insert into basicdetails values('CC003', 'CC002')
    insert into basicdetails values('CC004', 'CC003')
答案

我想我找到了答案。

;WITH cte AS (
        SELECT Id,
            documentno,
            DocumentTypeID,
            ParentCCID
        FROM basicdetails
        WHERE DocumentNo = 'CC02'

        UNION ALL

        SELECT R.Id,
            R.DocumentNo,
            R.DocumentTypeID,
            R.ParentCCID
        FROM basicdetails R
        JOIN cte P ON P.ParentCCID = R.DocumentNo
        ),

      cte2 AS (
        SELECT Id,
            documentno,
            DocumentTypeID,
            ParentCCID
        FROM basicdetails
        WHERE DocumentNo = 'CC002'

        UNION ALL

        SELECT R.Id,
            R.DocumentNo,
            R.DocumentTypeID,
            R.ParentCCID
        FROM basicdetails R
        JOIN cte2 P ON P.DocumentNo = R.ParentCCID
        )


SELECT Id,
    documentno,
    DocumentTypeID,
    ParentCCID
FROM cte     

 union   

SELECT Id,
    documentno,
    DocumentTypeID,
    ParentCCID
FROM cte2    

尽管我不确定这是否是最好的方法。确实有效。我只需要扭转JOIN cte P ON P.ParentCCID = R.DocumentNo并执行UNION

以上是关于如何在T-SQL中使用递归CTE获得完整的层次结构?的主要内容,如果未能解决你的问题,请参考以下文章

CTE递归获取树层次结构

如何创建参数化递归 CTE 以展平标量函数中的层次结构?

使用MySQL 8.0递归CTE查找层次结构表中的直接后代并传播给父级

T-SQL使用CTE递归

SQL Server CTE 递归查询全解

通用表表达式