SQL : SELECT avec héritage multiple

Nouveau WRInaute
Bonjour tout le monde !

Je suis bloqué depuis hier avec une requête de SELECT pour laquelle il me manque un truc...
Voici le schéma : j'ai plusieurs tables avec une relation parent / enfant :
A => B => C => D.
A partir de D, je souhaite atteindre une table Z, MAIS, j'ai 3 possibilités pour l'atteindre (et c'est là que ça se complique :mrgreen: ) :
- soit D => Z
- soit D => F => Z
- soit D => E => F => Z (F contient les id de D et E)

A chaque héritage, il peut y avoir plusieurs enfants...
En théorie, les données Z obtenue via D => Z ne se retrouvent pas dans D => F => Z, ni dans D => E => F => Z.
Sur cette table Z, qui est donc la cible, je souhaite obtenir une SUM pour une colonne.

Les jointures jusqu'à F se font par une simple id, mais pour atteindre Z il faut sélectionner un type et une date :roll:

J'étais donc parti sur quelque chose du genre :
Code:
SELECT *
FROM A
INNER JOIN B ON (B.id = A.id)
INNER JOIN C ON (C.id = B.id)
INNER JOIN D ON (D.id = C.id)
Mais je pense que je suis parti à l'envers ?! Car après je butte pour obtenir mon

Code:
SELECT SUM(Z.truc)
FROM Z
WHERE type=''
AND date=''

Un petit coup de main serait fort bien venu :)
 
Nouveau WRInaute
J'ai un peu avancé... J'arrive à ramener les valeurs pour SUM(Z.truc) WHERE A.id = 'xxx', en faisant le chemin A B C D E F Z :
Code:
SELECT  SUM(Z.truc)
FROM Z
INNER JOIN F ON (F.type = Z.type)
INNER JOIN E ON (E.id = F.e_id)
INNER JOIN D ON (D.id = E.d_id)
INNER JOIN C ON (C.id = D.c_id)
...
WHERE A.id = 'xxx'

Maintenant que j'ai le chemin le plus long, je ne sais pas comment faire pour ne pas cumuler les valeurs, mais ne pas en oublier non plus, dans les 3 chemins différents à partir de D :?

Edit :
Selon mes vérifications, ma SUM est multipliée par le nombre d'enfants d'une branche... Je n'ai pas de DISTINCT ou d'outer join, donc forcément il y a des doublons... Faudrait-il que je transforme tous mes join en left/right outer join ?
 
WRInaute occasionnel
J'avoue être un peu perdu dans tes explications et ta façon de faire ^^

Pour ne pas cumuler tu peux grouper les valeurs avec un GROUP BY sur id Z du coup...
S'il y a des enfants, peut être jouer sur des sous requête...

Après tu parles de ABCD puis DEFZ ? -_-"
C'est quoi de ce projet ? lol
 
Nouveau WRInaute
Salut !
Merci de passer :)

Alors oui, des fois, le matin, je ne suis pas très clair :D
En fait, du parent A à l'enfant D, l'héritage est simple et direct.
Mais, à partir de D, on peut emprunter 3 chemins pour atteindre la table Z, comme je l'expliquais dans mon 1er post.
Du coup, je peux faire D => Z, ou D=>F=>Z, ou bien encore D=>E=>F=>Z :?
 
Nouveau WRInaute
Mon problème est résolu : des id ont été rajoutées sur la table Z, du coup je n'ai plus de soucis !
 
Discussions similaires
Haut