Bonjour,
J'ai la situation suivante :
3 table : GrandParent 1àplusieurs Parent 1àplusieurs et Fils
Je veux une requête qui retourne pour chaque GrandParent la somme de ses fils, et 0 si aucun fils ou bien aucun parent.
merci d'avance
Bonjour,
J'ai la situation suivante :
3 table : GrandParent 1àplusieurs Parent 1àplusieurs et Fils
Je veux une requête qui retourne pour chaque GrandParent la somme de ses fils, et 0 si aucun fils ou bien aucun parent.
merci d'avance
Quelle requête as-tu commencé à écrire et où pèche-t-elle ?
Quel SGBD utilises-tu ?
Quelle est la structure de tes tables ?
Règles du forum Langage SQL à lire par tous
En essayant de deviner la structure, je dirais :
Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5 SELECT grandparent.nom, count(fils.idFils) FROM grandparent,parent,fils WHERE grandparent.idgrandparent=parent.idgrandparent AND parent.idparent = fils.idparent GROUP BY grandparent.nom
Mais je crois que le schéma est faux et mal fait. Déjà une relation réflexive serait beaucoup mieux pour modéliser ce genre de chose.
Puis ça n'est pas une relation un à plusieur qui relie grandparent à parent, ni parent à fils...
La requête d'ilys05 n'est pas loin du résultat mais, faute de jointure externe, ne retournera aucune ligne si un GrandParent n'a pas de Parent ou pas de Fils.
Par ailleurs une relation réflexive n'a pas grand intérêt lorsque la profondeur de la hiérarchie est aussi faible et connue à l'avance.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10 SELECT gpt.nom , COUNT(fls.idfils) FROM grandparent AS gpt LEFT JOIN parent AS prt ON gpt.idgrandparent = prt.idgrandparent LEFT JOIN fils AS fls ON prt.idparent = fls.idparent GROUP BY gpt.nom
PS : Depuis de nombreuses années déjà, les jointures utilisent le mot clé JOIN et ne s'écrivent plus comme un produit cartésien assorti d'une restriction.
c'est vrai.
Oui, mais là c'est faux. La relation qui existe entre parent et fils n'est pas 1 à plusieurs. Un fils possède deux parents.
.
Je me suis toujours habitué à utilisé les WHERE sur les clés primaires/étrangères, que je ne me suis jamais intéressé au mot clé JOIN. Question d'habitude seulement.
Non ce n'est pas qu'une question d'habitude. Si l'utilisation des jointures dans le WHERE est relativement similaire dans le cas des jointures fortes, elle est extrêmement simplifiée lors des jointures externes.
De plus, ce forum étant consacré au SQL tel que défini par la norme (même s'il y a des écarts en fonction de l'implémentation de cette dernière selon les différents SGBD), quand on peut s'y tenir, on s'y tient !
Totalement d'accord. Je ne ferais plus que du LEFT JOIN chef .
Merci beaucoup pour vos réponses
Vous avez un bloqueur de publicités installé.
Le Club Developpez.com n'affiche que des publicités IT, discrètes et non intrusives.
Afin que nous puissions continuer à vous fournir gratuitement du contenu de qualité, merci de nous soutenir en désactivant votre bloqueur de publicités sur Developpez.com.
Partager