0
我有两个存储过程。第一个存储过程返回顶级父项,第二个过程将返回提供的父ID的子项。每个孩子也可能是父母。使用存储过程的SQL递归
在研究CTE时遇到的问题是,每个示例似乎都依赖于ID + 1,由于该项目的ID不是顺序的,因此在此不起作用。任何指导在这里将不胜感激。
我有两个存储过程。第一个存储过程返回顶级父项,第二个过程将返回提供的父ID的子项。每个孩子也可能是父母。使用存储过程的SQL递归
在研究CTE时遇到的问题是,每个示例似乎都依赖于ID + 1,由于该项目的ID不是顺序的,因此在此不起作用。任何指导在这里将不胜感激。
下面是一个快速的CTE示例,展示了如何确定查询的深度。完整的SQL小提琴是在这里:http://www.sqlfiddle.com/#!6/5c3f47/1/0
WITH CTE AS (
SELECT
Records.Id,
Records.Name,
Records.ParentId,
CONVERT(INT, 1) AS Depth
FROM dbo.Records Records
WHERE Records.ParentId IS NULL
UNION ALL
SELECT
Records.Id,
Records.Name,
Records.ParentId,
CTE.Depth + 1
FROM CTE
INNER JOIN dbo.Records Records
ON CTE.Id = Records.ParentId
)
SELECT * FROM CTE
这对于该示例产生下面的输出:
| ID | NAME | PARENTID | DEPTH |
|----|-------|----------|-------|
| 1 | A | (null) | 1 |
| 2 | B | (null) | 1 |
| 5 | B.1 | 2 | 2 |
| 3 | A.1 | 1 | 2 |
| 4 | A.2 | 1 | 2 |
| 6 | A.1.1 | 3 | 3 |
| 7 | A.1.2 | 3 | 3 |
好吧,我不能确定从哪里开始。我知道这个问题需要递归,但是CTE上的所有示例都可以找到需要某种形式的顺序标识,这些标识可以递增或递减以获得下一个数据,这在这里不起作用。 – Adola 2014-11-14 19:35:25
从实际陈述您的问题开始,向我们显示您的查询和您的错误 – 2014-11-14 19:38:44
您能否提供一些ID示例?数据库中的关系如何维护?表格是否有父列和子列? – Michael 2014-11-14 20:22:55