Оптимизация подзапроса 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;