2010-11-11 7 views
0

Disons que j'ai les relations tableau ci-dessous (via les clés existantes sur les deux extrémités)valeurs somme SQL() avec plusieurs niveaux rejoint

table a -> table b 
table b -> table c 
table c -> table d 
table d -> table e 
table e -> table f 

Et je veux groupe par une clé sur table a et somme() de table f comme si les deux tables étaient directement jointes. Le problème est que si je fais cela, l'information sera dupliquée car toutes les relations d'un -> b -> c -> d -> e -> f se répéteront (comme Andomar a dit: certaines informations se répètent parce qu'il y a plusieurs routes de A à F)

Y at-il un moyen de contourner cela, ou est mon seul choix pour créer une table du milieu contenant la relation table a ->table f?

Détails:

Table a 
id1 | id2 

Table b 
id2 | id3 

Table c 
id3 | value 

select a.id1, sum(value) from a 
inner join b on a.id2 = b.id2 
inner join c on b.id3 = c.id3 
group by a.id1 

exemple des données:

Faire la jonction, la relation est:

a b c value 
1 2 2 20 
1 3 2 20 
1 4 2 20 

Si je fais la somme(), je vais obtenir 60 mais je veux pour obtenir 20

Merci

+0

Je pense que nous aurons besoin de plus d'informations sur les structures et les clés de la table –

+0

Modifier: J'ai ajouté un détail dans la question. La question ne nécessite pas vraiment ce niveau de détail, la question s'applique à tous les ensembles de tables. Supposons simplement que la table a est liée à la table b via une colonne, la table b est liée à la table c via une autre colonne, etc. –

+0

Que voulez-vous dire par "l'information sera dupliquée"? Quelle information? Si vous faites des jointures internes le long du chemin, vous devriez obtenir une copie unique de chaque ligne commune entre chaque deux tables. – BeemerGuy

Répondre

1

Je suppose que certaines informations se répète parce qu'il ya plusieurs routes de A à F. S'il y a une clé unique en F, vous pouvez dupliquer les non itinéraires à l'aide d'un sous-requête:

SELECT SubQuery.AValue, sum(SubQuery.FValue) 
FROM (
     SELECT a.value as AValue, f.key, f.value as FValue 
     FROM a 
     INNER JOIN b ON b.key = a.key 
     INNER JOIN c ON c.key = b.key 
     INNER JOIN d ON d.key = c.key 
     INNER JOIN e ON e.key = d.key 
     INNER JOIN f ON f.key = e.key 
     GROUP BY a.value, f.key, f.value 
     ) as SubQuery 
GROUP BY SubQuery.AValue 

Les sous-requête assure chaque rangée de F n'est comptée qu'une seule fois.

+0

Bonjour Andomar, merci beaucoup. Donc SQL n'a pas de syntaxe spéciale pour dire que je veux les routes uniques entre A et F dans la langue –

Questions connexes