2014-11-14 57 views
0

我有两个存储过程。第一个存储过程返回顶级父项,第二个过程将返回提供的父ID的子项。每个孩子也可能是父母。使用存储过程的SQL递归

在研究CTE时遇到的问题是,每个示例似乎都依赖于ID + 1,由于该项目的ID不是顺序的,因此在此不起作用。任何指导在这里将不胜感激。

+0

好吧,我不能确定从哪里开始。我知道这个问题需要递归,但是CTE上的所有示例都可以找到需要某种形式的顺序标识,这些标识可以递增或递减以获得下一个数据,这在这里不起作用。 – Adola 2014-11-14 19:35:25

+0

从实际陈述您的问题开始,向我们显示您的查询和您的错误 – 2014-11-14 19:38:44

+0

您能否提供一些ID示例?数据库中的关系如何维护?表格是否有父列和子列? – Michael 2014-11-14 20:22:55

回答

0

下面是一个快速的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 |