八八九九 发表于 2023-9-14 11:58:25

计算分层SQL数据中的子代数

对于一个简单的数据结构,例如:
ID    parentID    Text      Price
1               Root
2   1         Flowers
3   1         Electro
4   2         Rose      10
5   2         Violet      5
6   4         Red Rose    12
7   3         Television100
8   3         Radio       70
9   8         Webradio    90
供参考,层次树如下所示:
ID    Text      Price
1   Root
|2    Flowers
|-4   Rose      10
| |-6 Red Rose    12
|-5   Violet      5
|3    Electro
|-7   Television100
|-8   Radio       70
|-9 Webradio    90
我想计算每个级别的孩子人数。因此,我将获得一个新列“ NoOfChildren”,如下所示:
ID    parentID    Text      PriceNoOfChildren
1               Root               8
2   1         Flowers            3
3   1         Electro            3
4   2         Rose      10   1
5   2         Violet      5      0
6   4         Red Rose    12   0
7   3         Television100    0
8   3         Radio       70   1
9   8         Webradio    90   0
我读了一些有关分层数据的内容,但是我不知何故卡在了parentID的多个内部联接上。也许有人可以在这里帮助我。
               
解决方案:
               


                使用 CTE可以满足您的需求。
递归地遍历所有孩子,记住根。
COUNT 每个根的项目。
JOIN 这些再次与您的原始表一起产生结果。

测试数据
DECLARE @Data TABLE (
ID INTEGER PRIMARY KEY
, ParentID INTEGER
, Text VARCHAR(32)
, Price INTEGER
)
INSERT INTO @Data
SELECT 1, Null, 'Root', NULL
UNION ALL SELECT 2, 1, 'Flowers', NULL
UNION ALL SELECT 3, 1, 'Electro', NULL
UNION ALL SELECT 4, 2, 'Rose', 10
UNION ALL SELECT 5, 2, 'Violet', 5
UNION ALL SELECT 6, 4, 'Red Rose', 12
UNION ALL SELECT 7, 3, 'Television', 100
UNION ALL SELECT 8, 3, 'Radio', 70
UNION ALL SELECT 9, 8, 'Webradio', 90
SQL语句
;WITH ChildrenCTE AS (
SELECTRootID = ID, ID
FROM    @Data
UNION ALL
SELECTcte.RootID, d.ID
FROM    ChildrenCTE cte
          INNER JOIN @Data d ON d.ParentID = cte.ID
)
SELECTd.ID, d.ParentID, d.Text, d.Price, cnt.Children
FROM    @Data d
      INNER JOIN (
          SELECTID = RootID, Children = COUNT(*) - 1
          FROM    ChildrenCTE
          GROUP BY RootID
      ) cnt ON cnt.ID = d.ID
页: [1]
查看完整版本: 计算分层SQL数据中的子代数