2010-06-14 53 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

相關問題