2010-06-14 52 views
1

我有一个SQLServer2005的表“集团”,类似以下内容:如何迭代Sql Server 2005存储过程中的分层数据?

Id (PK, int) 
Name (varchar(50)) 
ParentId (int) 

其中的ParentId是指其他ID在组表。这是用来分层群体,如型号:

Group 1 (id = 1, parentid = null) 
    +--Group 2 (id = 2, parentid = 1) 
    +--Group 3 (id = 3, parentid = 1) 
      +--Group 4 (id = 4, parentid = 3) 
Group 5 (id = 5, parentid = null) 
    +--Group 6 (id = 6, parentid = 5) 

你明白了

我还有一个表,我们称之为“数据”为简化起见,它看起来像:

Id (PK, int) 
Key (varchar) 
Value (varchar) 
GroupId (FK, int) 

现在,我正在尝试编写一个存储过程,它可以让我获得给定组的“数据”。例如,如果我查询组1,它将返回数据中的键值对,其中groupId = 1。如果查询组2,则返回groupId = 1的KVPs,然后与具有groupId = 2(并且重复的密钥被替换)。

理想情况下,存储过程也将无法正常,如果有一个周期(即,如果第1组的母公司是2组和第2组的父组1)

有没有人有经验,写这样一个存储过程,或知道这可能如何实现?

谢谢你们,非常感谢,

亚历

+0

是否查询只选择该组及其父基来实现? – 2010-06-14 10:53:27

+0

该查询只会选择一个组(例如,EXECUTE usp_Data_QueryForGroup @GroupId = 3),然后存储的proc将处理确定该组父母并合理合并数据的逻辑) – AlexC 2010-06-14 10:58:04

回答

3

这可以通过使用递归查询和热膨胀系数

;WITH KeyValue AS 
(
SELECT G.Id, G.Name, D.Key, D.Value, 0 AS level 
FROM Group G 
LEFT JOIN Data D ON G.Id = D.GroupID 
WHERE G.Id = @your_top_level_root 

UNION ALL 

SELECT G.Id, G.Name, D.Key, D.Value, K.level + 1 
FROM KeyValue K 
JOIN Group G ON G.ParentId = K.Id 
LEFT JOIN Data D ON G.Id = D.GroupID 
) 
SELECT * FROM KeyValue 
+0

这很棒,工作得很好,谢谢许多。 – AlexC 2010-06-14 15:35:21

相关问题