我有以下表格。 文章,类别,ArticleCategories
每篇文章都有多个类别。 问题是数据库的设计方式是Category包含ParentCategoryId,而文章不需要与根类别连接,但实际上是它的一部分,因为它属于它的一个子类别。
实施例
分类
第
ArticleCategories
现在,我需要的是一种列出具有根类别(具有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
但这显然只是一个用现有类别加入文章的查询,而不是它们的根类别。 我想我需要某种递归来达到根类别。
答案 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部分)。