sql - 计算分层 SQL 数据中的子级数量

标签 sql sql-server hierarchy hierarchical-data

对于简单的数据结构,例如:

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           Television  100
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   Television  100
|-8   Radio       70
  |-9 Webradio    90

我想计算每个级别的 child 数量。所以我会得到一个新列“NoOfChildren”,如下所示:

ID    parentID    Text        Price  NoOfChildren
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           Television  100    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 (
  SELECT  RootID = ID, ID
  FROM    @Data
  UNION ALL
  SELECT  cte.RootID, d.ID
  FROM    ChildrenCTE cte
          INNER JOIN @Data d ON d.ParentID = cte.ID
)
SELECT  d.ID, d.ParentID, d.Text, d.Price, cnt.Children
FROM    @Data d
        INNER JOIN (
          SELECT  ID = RootID, Children = COUNT(*) - 1
          FROM    ChildrenCTE
          GROUP BY RootID
        ) cnt ON cnt.ID = d.ID

关于sql - 计算分层 SQL 数据中的子级数量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2340696/

相关文章:

sql - 查询 SSRS 数据集中的 View 与表

sql - 如果只选择一行,Top 1 会更快

java - 制作对象数组

SQL Server有没有办法绕过重复的条件行

SQL:在 LIKE 语句内的查询参数上使用 REGEXP_REPLACE

sql-server - 使用合并有效更新整行

ios - 处理 iOS 游戏和应用程序中的层次结构破坏效果

android - 如何在 Android 应用程序中进行 View 层次结构转储

mysql - 对列进行限制的建模数据库

MySQL 通过对一组值取一列的总和来对表进行排序