Question

D'abord le schéma relevent:

A est une table des entrées de la liste avec ListID, date et ItemID

B est une table des éléments sous-jacents avec ID et le propriétaire (qui est actuellement le texte).

C est une table des propriétaires avec ID (int), Nom (varchar) et Parent (int). Parent est soit l'ID d'un autre élément ou une valeur nulle si elle est un noeud de niveau supérieur. Ce tableau est profond seulement 2 niveaux de sorte que chaque membre est soit un enfant ou d'un parent.

Points A.ItemID à B.ID les points B.Owner à C.Name C.Parent est soit nul ou à un autre des points C.ID

Maintenant, le problème ...

Je dois compter le nombre d'entrées sur une liste donnée (ListID et date) pour chaque parent en C. J'ai presque avec un problème. La requête est:

select C.owner, COUNT(B.ID) as Count from A  
join B on A.ItemID = B.ID  
join C on B.Owner= C.Owner  
join C2 on C.Parent = C2.ID   
Where date = '2011-01-10' and ListID = 1  
Group by C2.Owner  
order by C2.Owner  

Mais il compte que les entrées qui correspondent avec des rangées d'enfants en C. Parce que les lignes mères ne possèdent pas leur propre identité dans le domaine parent, ils ne sont pas inclus dans les chiffres agrégés, même si il y a des éléments qui sont détenues directement par les parents dans le tableau C. Je suis assez sûr que je pouvais résoudre le problème en mettant ces valeurs, mais cela semble être une mauvaise conception que les lignes seraient effectivement leurs propres parents.

Y at-il un moyen de gérer cette requête compte pour cela? Je suis perplexe.

Sinon, est-il correct "d'avoir des lignes se référence en tant que parent à des fins de regroupement de leurs propres données avec celles de leurs enfants?

Merci pour tout et tous les conseils ici. Si ce n'est pas clair, je peux être plus précis, mais je suis en train de garder l'information sans rapport hors de lui.

-Dan

Était-ce utile?

La solution

Vous devez utiliser une gauche jointure sur C et C2.

C LEFT JOIN C2 ON C.Parent = C2.ID

Cela entraînera toutes les lignes à inclure de C, et, s'il y a un enfant correspondant en C2, qui sera également inclus.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top