2012-01-03 160 views
5

我有一個自引用表,像這樣的內容:自參照表

Self-referencing parent table 
ID ParentID Name 
--------------------- 
1    John 
2 1   Mike 
3 2   Erin 
4 1   Janie 
5    Eric 
6 5   Peter 

樹的層次結構應該是這樣的

  • 約翰
    • 邁克
      • Erin
    • 珍妮
  • 埃裏克
    • 彼得

和存儲父表的,看起來像這樣的樹葉子表:

ID Sales 
3 100 
3 100 
4 200 
4 200 
6 300 
6 300 
6 300 

我試圖將總和從葉節點上傳到層次結構,因此它將返回爲。 。

ID Name Sum 
1 John 800 
2 Mike 200 
3 Erin 200 
4 Janie 400 
5 Eric 900 
6 Peter 900 

任何想法如何在SQL 2008中實現這一點?提前致謝。

回答

5

編輯所有聚集移出CTE的

WITH 
    tree AS 
(
    SELECT 
    id    AS root_id, 
    name    AS root_name, 
    id    AS leaf_id 
    FROM 
    yourTreeTable 

    UNION ALL 

    SELECT 
    tree.root_id  AS root_id, 
    tree.name   AS root_name, 
    yourTreeTable.id AS leaf_id 
    FROM 
    tree 
    INNER JOIN 
    yourTreeTable 
     ON tree.leaf_id = yourTreeTable.ParentID 
) 
SELECT 
    tree.root_id, 
    tree.root_name, 
    COALESCE(SUM(yourScoresTable.score), 0) AS total 
FROM 
    tree 
LEFT JOIN 
    yourScoresTable 
    ON yourScoresTable.ID = tree.leafID 
GROUP BY 
    tree.root_id, 
    tree.root_name 
+0

感謝您的迴應,Dem。我收到了兩條錯誤消息:'GROUP BY,HAVING或聚合函數不允許在遞歸公用表表達式'flattend'的遞歸部分中使用GROUP BY,HAVING或聚合函數。''和'外部連接不允許在遞歸部分遞歸公用表表達式'flattend'。 '。有任何想法嗎? – Eric 2012-01-04 00:44:31

+0

@Eric - 我太過於練習了,我甚至都不記得會是這樣。我已經重新編碼,所有的聚合都是在CTE之外完成的。 – MatBailie 2012-01-04 00:52:05

+0

對於遲到的回覆感到抱歉,我不得不在昨天早些時候離開,而且我整個上午都在開會。查詢的作用像魅力。但是我很難理解CTE以及COALESCE功能的工作原理。我需要將ParentID列添加到結果中,以便我可以重建應用程序中的樹結構,但我一直得到不同的計數。你能多幫一點忙嗎?再次感謝。 – Eric 2012-01-04 19:53:49

1

這就是:

讓我們supose這個模式:

​create table #parent (
ID int, 
ParentID int, 
Name varchar(50)); 

create table #child (
ID int, 
Sales int); 

查詢是自我解釋說:

WITH 
    tree AS 
(
    SELECT 
    id as id_parent, 
    id as id 
    FROM 
    #parent 
    UNION ALL 
    SELECT 
    tree.id_parent as id_parent, 
    #parent.id AS id 
    FROM 
    tree 
    INNER JOIN 
    #parent  
     ON tree.id = #parent.ParentID 
) 
SELECT 
    #parent.id, 
    #parent.name, 
    COALESCE(SUM(#child.Sales), 0) AS total 
FROM 
    #parent 
LEFT JOIN 
    tree 
    ON #parent.ID = tree.id_parent 
LEFT JOIN 
    #child on tree.id = #child.id 
GROUP BY 
    #parent.id, 
    #parent.name 

CTE返回每個員工(#parent)的「葉子」列表,然後查詢爲此「葉子」的所有銷售額進行彙總。 You can test it running

EDITED

查詢是固定的。

+0

感謝您的回答。我試圖運行查詢,但我注意到根節點的總和不正確。約翰的總數應該是800而不是400. – Eric 2012-01-04 20:02:46

+0

@Eric,固定。但要小心,約翰的總和是600不是800(jhon = 0,Mike = 0,Erin = 100 + 100,Janie = 200 + 200) – danihp 2012-01-04 21:33:44

+0

我的不好。感謝您糾正這一點。我在這個問題上花了太多時間,我終於得到了我所需要的東西。再次感謝。 – Eric 2012-01-04 21:45:13