Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/24.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 Server)_Sql_Sql Server_Stored Procedures_Recursion - Fatal编程技术网

递归计数查询(SQL Server)

递归计数查询(SQL Server),sql,sql-server,stored-procedures,recursion,Sql,Sql Server,Stored Procedures,Recursion,我有两个MS SQL表:类别,问题。每个问题只分配给一个类别。一个类别可能有多个子类别 类别 Id:bigint(PK) 姓名:nvarchar(255) 问题:比特 IdParent:bigint(FK) 问题: Id:bigint(PK) 标题:nvarchar(255) IdCategory:bigint(FK) 如何递归计算给定类别的所有问题(包括子类别中的问题)。我已经根据一些教程尝试过了,但仍然无法理解:( CTE构建了一个列表,其中每个类别下都有子类别——本质上,它在树中

我有两个MS SQL表:类别,问题。每个问题只分配给一个类别。一个类别可能有多个子类别

类别
  • Id:bigint(PK)
  • 姓名:nvarchar(255)
  • 问题:比特
  • IdParent:bigint(FK)
问题:
  • Id:bigint(PK)
  • 标题:nvarchar(255)
  • IdCategory:bigint(FK)
如何递归计算给定类别的所有问题(包括子类别中的问题)。我已经根据一些教程尝试过了,但仍然无法理解:(

CTE构建了一个列表,其中每个类别下都有子类别——本质上,它在树中递归,并生成(顶部类别,子类别)的平面视图

初始项(在union all之前)选择每个类别,并指示它包含自己-递归项然后包括迄今为止找到的类别的所有子类别,并且在上一次迭代中的所有类别id列都是叶类别时自动停止(不产生结果)


基于此,我们只需将此展开视图连接回问题,以生成一组(顶级类别,问题)行,并基于(顶级类别)进行聚合.

Thomas,SQL SERVER 2008 Express Edition.araqnid,您的解决方案可以立即运行,但是结果集包含所有类别。如何仅获取给定类别id的计数?在类别树定义中的初始项中,在“union all”之前添加一个“where”子句。这定义了扫描类别树的起点-如果将其限制为单个类别,则子树将以该类别为根。
with /* recursive */ category_tree as (
  select category.id as top_category_id, category.id as category_id
  from category
union all
  select top_category_id, category.id
  from category_tree
       join category on category.idparent = category_tree.category_id
)
select category_tree.top_category_id as category, count(*) as question_count
from category_tree
     join question on question.idcategory = category_tree.category_id
group by category_tree.top_category_id