T-SQL递归;多次递归?

时间:2011-09-02 20:18:35

标签: sql sql-server sql-server-2008 recursion recursive-query

我正在尝试概念化一个解决我遇到的递归问题的方法,而我无法完全理解它。我有三张桌子。我们会称他们为DocGroupGroupGroupGroupUser。在DocGroup表中有一个记录的雇用结构,它指定另一个记录作为它的父亲,依此类推,直到记录是它自己的父记录。

Doc Group
1   1
2   2
3   2
4   3
5   2
6   4

GroupGroup包含组嵌套:

Group    MemberGroup
4        2
4        1

GroupUser将一个群组映射到多个用户:

Group    User   Key
1        1      ABC
1        3      BCD
1        4      CDE
2        1      DEF
2        2      EFG
2        3      FGH
3        3      GHI
4        2      HIJ
4        3      IJK
4        4      JKL

所以我想指定一个用户和一个文档,并获得该组合的所有键的列表。例如,如果我选择用户2和文档2,我需要返回“EFG”,但如果我选择文档6和用户3,我需要返回“IJK”,“GHI”,“FGH”和“BCD”,因为组2和1在第4组中,第4组=第4组,其中包含3个组。在所有情况下,我只需要获取指定用户的记录。

我想我需要多次递归才能完成这项任务,但我似乎无法在心理上绘制出如何在SQL中完成的工作,我不想降级为循环和游标来执行此操作。< / p>

2 个答案:

答案 0 :(得分:2)

好的,这是答案:

DECLARE @Key varchar(max)

;WITH DocBase AS (
    SELECT Doc, Group
        FROM DocGroup
        WHERE Doc = @Doc
    UNION ALL
    SELECT DocGroup.Doc, DocGroup.Group
        FROM DocGroup INNER JOIN DocBase
            ON DocGroup.Doc = DocBase.Group
        WHERE DocBase.Doc <> DocBase.Group --to prevent infinite recursion
    ), GroupNesting AS (
    SELECT Doc
        FROM DocBase
    UNION ALL
    SELECT MemberGroup
        FROM GroupGroup.Group = GroupNesting.Doc
    ), GroupList AS (
    SELECT DISTINCT Doc
        FROM GroupNesting
    ), KeyList AS (
    SELECT Key
        FROM GroupList INNER JOIN GroupUser
            ON GroupList.Doc = GroupUser.Group
        WHERE User = @User
    )
SELECT @Key = COALESE(@Key, '') + Key
    FROM Key

SELECT @Key

我本可以使用http://www.simple-talk.com/sql/t-sql-programming/concatenating-row-values-in-transact-sql/中的任何建议来进行最后的连接,但是我选择了这种方法,因为它是最简单的,我还是把它放在一个程序中。

答案 1 :(得分:1)

我必须发布这个因为我是一个狂热的自大狂:

The Zen of Recursion

但严重的是,这就是我们在当天的表现。这些天,您使用的是Common Table Expression

HTH。