2010-01-08 253 views
4

可能重複:
Recursive function in sql server 2005?SQL遞歸查詢

你如何對錶執行迭代查詢?我有一個簡單的表,它由一個:

KeyField, childID, parentID 

與childID的開始,我想拉的parentID,然後再次查詢,看是否父母(也就是現在的孩子)都有自己的父母,工作通過完整的層次結構,我該怎麼做?

的Microsoft SQL Server,版本號09.00.3042

+1

把你重複的挑:http://stackoverflow.com/search?q=recursive+cte – 2010-01-08 05:51:11

+1

特別:http://stackoverflow.com /問題/ 1709397 /遞歸函數在SQL服務器2005年 – 2010-01-08 05:53:15

+0

是的,大量的重複 - 雖然這是一個惱人的情況下,除非知道遞歸CTE,人們可能不知道搜索條件使用。 – 2010-01-08 05:54:50

回答

5

在SQL Server 2005及更高版本,你最好使用遞歸CTE(公共表表達式)對於這種查詢。 (在SQL 2000和更早版本中,您僅限於使用遞歸存儲過程)。

像下面的內容就是你需要:

WITH ParentChildRels (ParentId, ChildId, KeyField, HierarchyLevel) AS 
(
    -- Base case 
    SELECT 
     ParentId, 
     ChildId, 
     KeyField, 
     1 as HierarchyLevel 
    FROM Records 
    WHERE ChildId = @ChildId 

    UNION ALL 

    -- Recursive step 
    SELECT 
     r.ParentId, 
     r.ChildId, 
     r.KeyField, 
     pr.HierarchyLevel + 1 AS HierarchyLevel 
    FROM Records r 
     INNER JOIN ParentChildRels pr ON 
     r.ParentId = pr.ParentId 
) 

SELECT * 
FROM ParentChildRels 
ORDER BY HierarchyLevel, ParentId, ChildId, KeyField 
+0

遞歸WITH是用於處理遞歸查詢的ANSI標準,但支持是有限。 Oracle支持11g中的遞歸WITH,但WITH支持9i +並且它有自己的分層語法。 – 2010-01-08 06:13:28