递归 COUNT 查询 (SQL Server)

Cos*_*smo 2 sql sql-server recursion stored-procedures

我有两个 MS SQL 表:类别、问题。每个问题都被分配到一个类别。一个类别可能有许多子类别。

类别

  • ID : bigint (PK)
  • 名称 : nvarchar(255)
  • 接受问题:位
  • IdParent : bigint (FK)

  • ID : bigint (PK)
  • 标题:nvarchar(255) ...
  • IdCategory : bigint (FK)

如何递归计算给定类别的所有问题(包括子类别中的问题)。我已经根据几个教程尝试过它,但仍然无法弄清楚:(

ara*_*nid 7

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
Run Code Online (Sandbox Code Playgroud)

CTE 构建了一个列表,列出每个类别下的子类别 - 本质上,它遍历树并生成(顶级类别,后代类别)的扁平视图。

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

在此基础上,我们简单地将这个扁平化视图连接回问题以生成一组(顶级类别,问题)行,并基于(顶级类别)进行聚合。

  • 将“where”子句添加到category_tree 定义内的初始术语中,就在“union all”之前。这定义了扫描类别树的起点 - 如果将其限制为单个类别,您将获得以该类别为根的子树。 (2认同)