Оптимизация подзапроса SQL

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

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

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

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

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

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

2 ответа

Решение
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

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