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
Modérateur Langage SQL
Règles du forum Langage SQL à lire par tous,
N'hésitez pas à consulter les cours SQL
N'oubliez pas le bouton
et pensez aux balises [code]
Si une réponse vous a aidé à résoudre votre problème, n'oubliez pas de voter pour elle en cliquant sur
Aide-toi et le forum t'aidera : Un problème exposé sans mentionner les tentatives de résolution infructueuses peut laisser supposer que le posteur attend qu'on fasse son travail à sa place... et ne donne pas envie d'y répondre.
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.
Modérateur Langage SQL
Règles du forum Langage SQL à lire par tous,
N'hésitez pas à consulter les cours SQL
N'oubliez pas le bouton
et pensez aux balises [code]
Si une réponse vous a aidé à résoudre votre problème, n'oubliez pas de voter pour elle en cliquant sur
Aide-toi et le forum t'aidera : Un problème exposé sans mentionner les tentatives de résolution infructueuses peut laisser supposer que le posteur attend qu'on fasse son travail à sa place... et ne donne pas envie d'y répondre.
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 !
Partager