#sql #sql-server
#sql #sql-сервер
Вопрос:
у меня есть отношение от N к N из категорий к элементам в моей базе данных.
У меня есть три таблицы для этого:
Категории, элементы и Categories_Items
Я хотел бы получить все категории и дополнительное поле рядом с каждой, сообщающее мне, активна она или нет.
Это то, что у меня есть на данный момент:
SELECT C.ID
,C.Name
,IsActive=????
FROM Categories C
left join Items_Categories IC on IC.CategoryID=C.ID
where IC.ItemId=@ItemID
Результат, который я хотел бы получить, представляет собой список всех доступных категорий и помеченных как активные те, которые находятся в таблице Items_Categories и совпадают с @ItemId:
Имя идентификатора активно -- --------- -------- 1 Category1 0 2 Category2 1 3 Категория3 .....
Комментарии:
1. Что делает категорию «активной»? Это то, что он используется для категоризации элемента?
2. Почему соединение слева? Это не будет действовать, поскольку вы используете Items_Categories. ItemId в предложении WHERE, результаты так же хороши, как и при внутреннем соединении
3. Привет, спасибо за ваш быстрый ответ. я неправильно объяснил себя в этом сообщении. я хотел бы получить все категории и пометить как активные те, которые находятся в другой таблице.
Ответ №1:
Попробуйте это:
SELECT C.ID
,C.Name
,CASE
WHEN IC.CategoryID IS NULL THEN 0
ELSE 1
END IsActive
FROM Categories C LEFT JOIN Items_Categories IC
ON IC.CategoryID=C.ID
AND IC.ItemId=@ItemID
Комментарии:
1. Спасибо, это было именно то, что я искал.
Ответ №2:
SELECT C.ID
,C.Name
,CASE WHEN /*Whatever condition makes it active goes here*/ THEN 1 ELSE 0 END AS IsActive
FROM Categories C
LEFT JOIN Items_Categories IC on IC.CategoryID=C.ID
WHERE IC.ItemId=@ItemID
Это должно помочь… Если вы определите условие, которое делает его активным, я обновлю запрос
Ответ №3:
SELECT C.ID
,C.Name
,isnull((select 1 from [tablename] where [tablename.Category] = C.Name), 0) as IsActive
FROM Categories C
left join Items_Categories IC on IC.CategoryID=C.ID
where IC.ItemId=@ItemID