我正在尝试概念化一个解决我遇到的递归问题的方法,而我无法完全理解它。我有三张桌子。我们会称他们为DocGroup
,GroupGroup
和GroupUser
。在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>
答案 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)