【问题标题】:How to get full hierarchy with recursive CTE in T-SQL?如何在 T-SQL 中使用递归 CTE 获得完整的层次结构?
【发布时间】:2020-08-31 06:21:44
【问题描述】:

表格:

+-----+------------+-------------+
| 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')

【问题讨论】:

    标签: sql sql-server database tsql recursion


    【解决方案1】:

    我想我找到了答案。

    ;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

    【讨论】:

      猜你喜欢
      • 2023-03-24
      • 2013-11-07
      • 1970-01-01
      • 1970-01-01
      • 2016-12-07
      • 2017-02-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多