2011-12-24 9 views
2

私はレシピは、そのカテゴリに実際にあるかどうかに加えて、すべてのカテゴリの区分と名前を返す方法を探しています二つのテーブル、CategoriesRecipeCategoriesSQLサブクエリの最適化

**Categories** 
CategoryID varchar (Primary Key) 
Name varchar 

**RecipeCategories** 
RecipeID varchar 
CategoryID varchar 
Composite primary key 

を持っています。

しかし、私はテーブルが大きすぎる場合、それはスケールするとは思わない。

答えて

1
SELECT c.CategoryID 
    , c.Name 
    , Case When (r.RecipeID is null) Then 'No' Else 'Yes' End 
    FROM Categories c 
    left join RecipeCategories r on r.CategoryID = c.CategoryID 
           and r.RecipeID = @recipeId 
+0

および代わりにWHERE。興味深い解決策、ありがとう。 – Echilon

+0

はい、 'RecipeID = @ recipeId'は結合条件になっている必要があります。それ以外の場合は、1つの行だけを取得します。 – DavidEG

0

以下の例を使用できますが、このソリューションを大規模な環境でスケーラビリティにするには、RecipeIDのインデックスを作成する必要があります。

SELECT c.CategoryID, c.Name, count(rc.Composite) FROM Categories c 
LEFT JOIN RecipeCategories rc ON c.CategoryID = rc.CategoryID 
WHERE RecipeID = @recipeId 
GROUP BY c.CategoryID, c.Name;