3

我有一個表格,格式如下。這是一個自引用表,其中每條記錄指向其父記錄。在分級表中滾動計數(自身參照表)

NODE_ID PARENT_ID COUNT 
1  0   NULL 
2  1   NULL 
3  2   10 
4  2   12 
5  0   NULL 
6  5   NULL 
7  6   NULL 
8  7   12 

我想輸出的格式應該是下面的。父項的數量應該是葉子數的總和。 注意:只有葉孩子將包含計數。我想把它捲起來直到父母。

NODE_ID PARENT_ID COUNT 
1  0   22 
2  1   22 
3  2   10 
4  2   12 
5  0   12 
6  5   12 
7  6   12 
8  7   12 

請幫忙。

+0

@GiorgosBetsos我認爲你誤讀了輸出。節點'2'有兩個孩子,總數爲'22'。反過來,節點'1'只有小孩'2',計數爲'22'。他可能需要某種遞歸查詢。 –

+0

@Tim Biegeleisen你是對的,我想要直接的孩子的總數。 – gkarya42

回答

0

嗯,我想不出什麼更簡單:

;WITH GetLevelsCTE AS (
    SELECT NODE_ID, PARENT_ID, COUNT, level = 1, ROOT = NODE_ID 
    FROM mytable 
    WHERE PARENT_ID = 0 

    UNION ALL 

    SELECT t1.NODE_ID, t1.PARENT_ID, t1.COUNT, level = t2.level + 1, t2.ROOT 
    FROM mytable AS t1 
    JOIN GetLevelsCTE AS t2 ON t2.NODE_ID = t1.PARENT_ID 
), MaxLevelCTE AS (
    -- Get MAX level per root NODE_ID 
    SELECT MAX(level) AS max_level, ROOT 
    FROM GetLevelsCTE 
    GROUP BY ROOT 
), GetCountCTE AS (
    -- Anchor query: start from the bottom 
    SELECT t1.NODE_ID, t1.PARENT_ID, t1.COUNT, t1.level 
    FROM GetLevelsCTE AS t1 
    JOIN MaxLevelCTE AS t2 ON t1.ROOT = t2.ROOT 
    WHERE t1.level = t2.max_level 

    UNION ALL 

    -- Recursive query: get counts of next level 
    SELECT t1.NODE_ID, t1.PARENT_ID, t2.COUNT, t1.level 
    FROM GetLevelsCTE AS t1 
    JOIN GetCountCTE AS t2 ON t1.level = t2.level - 1 AND t1.NODE_ID = t2.PARENT_ID 
) 
SELECT NODE_ID, PARENT_ID, SUM(COUNT) AS COUNT 
FROM GetCountCTE 
GROUP BY NODE_ID, PARENT_ID 
ORDER BY NODE_ID 

簡短說明:

  • GetLevelsCTE用於將level編號分配給樹的每個節點。
  • MaxLevelCTE使用先前的CTE以獲取樹的最大等級。
  • GetCountCTE使用前面的CTEs爲了遍歷樹從底部到父節點。這樣,COUNT傳播到父節點。
+0

:感謝您的回放。您的查詢僅在只有一個層級的情況下有效。如果在同一張桌子上,我有兩個頂級父母(節點沒有父母或父母身份證0),那麼它不會工作。我希望你能得到我的關注。 – gkarya42

+0

我已更新問題表。父標識0表示樹層次結構的根。 – gkarya42

+0

如果表中樹的部分不同,我的錯誤問題就會複製出來。 – gkarya42