2016-12-21 5 views
1

私は以下のテーブルを持っています。 記事、カテゴリ、記事カテゴリテーブルと再帰クエリの結合

各記事には複数のカテゴリがあります。 問題は、データベースがカテゴリにParentCategoryIdを含むように設計されており、記事がルートカテゴリに接続する必要はなく、実際にそのカテゴリの子カテゴリの1つに属しているためです。

カテゴリー

  1. 区分1、ParentCategory 0
  2. カテゴリ2、ParentCategory 1
  3. カテゴリ3、ParentCategory 2

    私は必要なもの
  1. ID = 1

ArticleCategories今

  1. 情報でarticleID = 1、区分= 3

は、(そのルートカテゴリで記事を一覧表示する方法ですカテゴリいますParentID = 0を持つ)。 返されたデータセットは、私が

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 

で始まっしかし、これは明らかに既存のカテゴリではなく、彼らのルートカテゴリで記事に参加するだけのクエリで情報でarticleIDとRootCategoryId(子カテゴリの必要がない)

を持っているでしょう。 私はルートカテゴリに到達するために何らかの種類の再帰が必要だと思います。

答えて

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部分)。

+0

なぜ最初のselect文でc.categoryidを2倍に選択しますか? – Robert

+0

@Robert。 。 。 1つはカテゴリID用で、もう1つはルートカテゴリID用です。 –