Sql-запрос получает все категории, и если они активны

#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