连接表和递归查询

时间:2016-12-21 13:29:24

标签: sql sql-server

我有以下表格。 文章,类别,ArticleCategories

每篇文章都有多个类别。 问题是数据库的设计方式是Category包含ParentCategoryId,而文章不需要与根类别连接,但实际上是它的一部分,因为它属于它的一个子类别。

实施例

分类

  1. CategoryId 1,ParentCategory 0
  2. Category2,ParentCategory 1
  3. 第3类,ParentCategory 2
    1. Id = 1
    2. ArticleCategories

      1. ArticleId = 1,CategoryId = 3
      2. 现在,我需要的是一种列出具有根类别(具有ParentID = 0的类别)的文章的方法。 返回的数据集将具有ArticleID和RootCategoryId(不需要子类别)

        我从

        开始
        SELECT 
        ar.Id, 
        ar.Title, 
        ac.CategoryId,
        ca.Name FROM Article ar
        INNER JOIN ArticleCategories ac
        ON ar.Id = ac.ArticleId
        INNER JOIN Categories ca
        ON ca.CategoryId = ac.CategoryId
        

        但这显然只是一个用现有类别加入文章的查询,而不是它们的根类别。 我想我需要某种递归来达到根类别。

1 个答案:

答案 0 :(得分:4)

您可以使用递归cte:

生成根类别
with cr as (
      select c.categoryid, c.categoryid as root_categoryid
      from categories c
      where c.parentcategoryid = 0
      union all
      select c.categoryid, cr.root_categoryid
      from categories c join
           cr
           on c.patentcategoryid = cr.categoryid
    )
select *
from cr;

然后您可以使用它来加入父类别(您似乎理解如何将事物连接在一起,因此这个答案只关注递归CTE部分)。