Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/76.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
计算分层SQL数据中的子级数_Sql_Sql Server_Hierarchy_Hierarchical Data - Fatal编程技术网

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

计算分层SQL数据中的子级数,sql,sql-server,hierarchy,hierarchical-data,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 Televisio

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

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
我想数一数每个级别的儿童人数。所以我会得到一个新的专栏“NoOfChildren”,就像这样:

我读了一些关于层次数据的东西,但不知怎么的,我被parentId上的多个内部连接卡住了。也许有人能帮我一下。

使用a可以得到你想要的。

  • 递归地遍历所有子项,记住根
  • COUNT
    每个根目录的项目
  • 再次将它们与原始表连接起来,以生成结果
测试数据

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

考虑使用一种改进的前序树遍历方式来存储分层数据。看

然后,确定任何节点的子节点数就变得很简单:

SELECT (right-left-1) / 2 AS num_children FROM ...

层次结构树与输入不匹配。输出似乎与层次结构不匹配。从你的层次结构来看,我假设ID的4和7有0个孩子。你完全正确,层次结构树+输出混乱,谢谢你明确的答案,完美的解决方案。想让我了解一下“;”的用法吗?我有时会在与语句一起使用时出现语法错误,即我没有那么讨厌的“;”。我是否总是必须用附加的语句“转义”@moontear:
WITH
子句定义
CTE
可以与定义表提示的
WITH
子句混合使用。如果前者不是批处理中的第一个语句,则应使用分号显式分隔。+1,几乎与使用拆分函数的交叉应用一样困难,但并不常见;-)@moontear,只要养成习惯,总是使用如下命令对与相邻的分号进行编码:
;使用
,您将永远不会遇到问题(就像@Lieven的代码)@MehdiDaustany-您可以添加以下查询提示以通过默认递归级别
选择。。。从…起选项(MAXRECURSION 200)
您为我节省了很多时间。对我来说最好的答案是:)这个系统太棒了!不幸的是,我无法使用,因为我必须使用一个已建立的系统,但我会记住它,以确保新的发展。
SELECT (right-left-1) / 2 AS num_children FROM ...