假設有一個下面的表table1,說明親子關係和公制是:SUM指標的歸一化邏輯層次
Parent | Child | Metric (of a child)
------------------------------------
name0 | name1 | a
name0 | name2 | b
name1 | name3 | c
name2 | name4 | d
name2 | name5 | e
name3 | name6 | f
特點:
1)兒童總是有且只有1個父母;
2)父母可以有多個孩子(name2具有name4和name5作爲孩子);
3)這個「層次結構」中的層次數和任何給定父項的子項數是任意的,並且不相互依賴;
我需要SQL請求,將返回結果集,每個名字和它的所有後代的度量的總和下降到底層加上本身,因此在本例表中的結果將是(在NAME1仔細看):
Name | Metric
------------------
name1 | a + c + f
name2 | b + d + e
name3 | c + f
name4 | d
name5 | e
name6 | f
(NAME0是無關緊要的,並且可以被排除)。
它應該是ANSI或Teradata SQL。
我得到儘可能可以返回給定名稱的所有後代的SUM(公制)遞歸查詢:
WITH RECURSIVE temp_table (Child, metric) AS
(
SELECT root.Child, root.metric
FROM table1 root
WHERE root.Child = 'name1'
UNION ALL
SELECT indirect.Child, indirect.metric
FROM temp_table direct, table1 indirect
WHERE direct.Child = indirect.Parent
)
SELECT SUM(metric) FROM temp_table;
有沒有辦法把這個查詢成需要的名字作爲函數一個參數並返回這個總和,所以可以這樣調用它?
SELECT Sum_Of_Descendants (Child) FROM Table1;
有關如何從不同的角度來處理這個任何建議,將不勝感激爲好,因爲即使上面的方法是可實現的,這將是業績不佳 - 會有很多的閱讀指標的迭代(在這個例子中值f將被讀取3次)。理想情況下,查詢應該只讀取一次每個名稱的度量。
您是否考慮過遞歸視圖定義,在查詢它時指定了子項? –
@RobPaller:我認爲這是一個好主意;發佈它作爲答案,以便我可以投票! – BellevueBob
這將如何比遞歸查詢優勢?我仍然必須在視圖定義中硬編碼最初的「根」名稱,對吧? – Alex