Оптимизация подзапроса SQL - PullRequest
2 голосов
/ 24 декабря 2011

У меня есть две таблицы: Categories и RecipeCategories

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

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

Я ищу способ вернуть CategoryID и Имя для всех категорий, плюс есть ли в этом рецепт или неткатегория.Я мог бы использовать что-то вроде

SELECT c.CategoryID, c.Name, 
         (SELECT COUNT(*) 
          FROM RecipeCategories 
          WHERE RecipeID = @recipeId AND CategoryID = c.CategoryID))
FROM Categories c

Но я не думаю, что это будет масштабироваться, если стол станет слишком большим.

Ответы [ 2 ]

1 голос
/ 24 декабря 2011
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 голосов
/ 24 декабря 2011

Вы можете использовать приведенный ниже пример, но чтобы сделать это решение масштабируемым в больших средах, вам необходимо индексировать 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;
...