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 

助けてください。

4

1 に答える 1

1

まあ、私はもっと簡単なことは考えられませんでした:

;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

簡単な説明:

  • GetLevelsCTElevelツリーのすべてのノードに番号を割り当てるために使用されます。
  • MaxLevelCTECTEツリーの最大レベルを取得するために、以前のものを使用します。
  • GetCountCTECTEsツリーを下から親ノードまでトラバースするために、前の両方を使用します。このようにして、COUNTが親ノードに伝播されます。
于 2016-09-06T09:33:07.987 に答える