2010-01-08 159 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