2014-11-14 61 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 |