2011-06-10 2 views
0

J'ai une relation de N à N de catégories à des éléments dans ma base de données.Sql requête obtenir toutes les catégories et si sont actifs

J'ai trois tables pour cela:

Catégories, Articles et Categories_Items

Je voudrais obtenir toutes les catégories et un champ supplémentaire à côté de chacun me disant que si est actif ou non.

C'est ce que j'ai par le moment:

SELECT C.ID 
      ,C.Name 
      ,IsActive=???? 
     FROM Categories C 
     left join Items_Categories IC on IC.CategoryID=C.ID 
    where [email protected] 

Le résultat je voudrais obtenir une liste de toutes les catégories disponibles et marquée comme active ceux qui sont dans la table Items_Categories et correspond à la @ItemId:

 
ID Name  IsActive 
-- --------- -------- 
1 Category1 0 
2 Category2 1 
3 Category3 ..... 
+1

Ce qui rend une catégorie « active »? Est-ce que c'est utilisé pour catégoriser un article? – diagonalbatman

+1

Pourquoi la gauche rejoindre? Il ne sera pas en vigueur puisque vous utilisez Items_Categories.ItemID dans la clause WHERE, les résultats sont aussi bons qu'une jointure interne – Chandu

+0

Salut, merci pour votre réponse rapide. Je n'ai pas expliqué correctement mon auto dans le poste. Je voudrais obtenir toutes les catégories et marquer comme actives celles qui sont dans l'autre table. – Jose3d

Répondre

2

Essayez ceci:

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 [email protected] 
+0

Merci, c'était exactement ce que je cherchais. – Jose3d

1
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 [email protected] 

Cela devrait aider ... Si vous définissez la condition qui le rend actif, je vais mettre à jour la requête

0
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 [email protected] 
Questions connexes