2011-07-28 2 views
0

私のアプリでは、 "ドキュメント"は単なる情報のテーブルレコードです。ここでは、テーブル(簡略化され、いくつかの)カテゴリに実際にドキュメントが含まれている場合にのみ、ドキュメントカテゴリ(親を含む)をプルするようクエリしますか?

ドキュメントの表です

  • DOCIDのint型のPK
  • タイトル
  • コンテンツ
  • DateUploaded
  • 等...

DocumentCategories表

  • CATID
  • ParentIdは
  • 等...

DocCats表(テーブル結合)

  • DOCID PK
  • CATID PK

適切な関係もあります。 「ドキュメント」は、DocCatsテーブル(DocId of the Document、カテゴリのCatId)にエントリを入れることによってカテゴリに入れられます。カテゴリには親カテゴリがあり、ParentIdフィールドに示されます。 ParentIdが0の場合、そのカテゴリは親カテゴリです。

私は1つの注意点と、実際に文書が含まれているすべてのカテゴリを引くしたい:私も親カテゴリを必要としています。

答えて

1

クイックタイプアップが、私は、これは完全にバグ無料で保証することはできませんが、これは一般的な考えでなければなりません。カテゴリを自分自身に戻して親の名前を取得し、DocCatsテーブルに初期カテゴリの存在を確認します。

select 
    cat.Name, parent.Name 
from 
    DocumentCategories cat 
    inner join DocumentCategories parent 
     on parent.CatId = case when cat.ParentId = 0 then cat.CatId else cat.ParentId end 
where 
    exists (
     select 1 
     from 
      DocCats dc 
     where 
      dc.CatId = cat.CatId) 
+0

おかげで、素晴らしい作品!このクエリのパフォーマンスに関する懸念事項はありますか? – Chaddeus

1
SELECT cat.Name, parent.Name 
FROM DocumentCategories AS cat 
    LEFT JOIN DocumentCategories as parent ON (cat.ParentId = parent.CatId) 
    LEFT JOIN (SELECT DISTINCT CatID FROM DocCats) AS doc ON (cat.CatId = doc.CatId) 
WHERE (doc.CatId IS NOT NULL) 
関連する問題