2010-08-19 4 views
0

J'ai une requête qui fonctionne bien quand il y a des données mais pas quand je n'ai rien dans la table de charité. Toute aide serait grandement appréciée.Compte SQL sur 3 tables

SELECT C.CategoryId 
    , C.CategoryName 
    , ISNULL(COUNT(CC.CharityId), 0) as CharityCount 
    , C.IsDeleted 
FROM Charity.Categories C 
LEFT JOIN Charity.CharityCategories CC on C.CategoryId = CC.CategoryId 
LEFT JOIN Charity.Charities CH ON CC.CharityId = CH.CharityId 
WHERE CH.IsApproved = 1 and CH.IsDeleted = 0 
GROUP BY C.CategoryId, C.CategoryName , C.IsDeleted 
Order By C.CategoryName 

j'essaie essentiellement de récupérer tous les Charity.Categories disponibles avec les comptes des organismes de bienfaisance approuvés et non supprimés.

Répondre

4

Essayez de changer ainsi:

SELECT C.CategoryId 
    , C.CategoryName 
    , ISNULL(COUNT(CC.CharityId), 0) as CharityCount 
    , C.IsDeleted 
FROM Charity.Categories C 
LEFT JOIN Charity.CharityCategories CC on C.CategoryId = CC.CategoryId 
LEFT JOIN Charity.Charities CH ON CC.CharityId = CH.CharityId 
    AND CH.IsApproved = 1 and CH.IsDeleted = 0 
GROUP BY C.CategoryId, C.CategoryName , C.IsDeleted 
Order By C.CategoryName 

En référence CH (Charities) dans la clause WHERE vous définissez telle que, lorsque ces valeurs sont NULL (aucun enregistrement dans les organismes de bienfaisance correspond), alors les données de l'autre les tables sont également exclues.

En général, j'essaie d'inclure toutes les contraintes/tous les filtres dans la clause de jointure, dans la mesure du possible, pour cette raison.

+0

Merci Daniel, ça marche. Je vais marquer comme réponse dès que possible. –

+0

+1. J'ai dû lire la question pour trouver la différence entre les deux requêtes . –