如何在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获得完整的层次结构?的主要内容,如果未能解决你的问题,请参考以下文章