Requete sql

Bonjour, A tous

j'ai un exercice très long et j'ai presque tout trouver sauf une derniere requete...

si vous pouviez m'aider :

Trouver les noms et numéros de carte des inscrits qui participent à (au moins) un cours auquel participe Bonnard

schéma :

COURS(NomCours,Enseignant,Niveau)
INSCRIT(Nocarte,Nom,Age,Sexe)
PLANNING(NomCours,Jour,Lieu,Heure)
PATICIPATION(Nocarte,NomCours)

merci d'avance pour votre aide...cette question m'aura fait transpiré

37 réponses

  • Votes
  • Date
  • Date décroissante
Résumé de la discussion

Trouver les noms et numéros de carte des inscrits qui participent à au moins un cours auquel Bonnard participe, en s'appuyant sur COURS, INSCRIT et PARTICIPATION et en combinant les règles d’agrégation. Plusieurs répondants privilégient COUNT plutôt que SUM et recommandent GROUP BY sur NoCarte et Nom avec HAVING COUNT(I.NoCarte) > 1 pour filtrer les inscrits concernés. Des échanges comparent aussi les jointures explicites (JOIN) et les jointures implicites, et discutent des résultats lorsque NATATION I et NATATION II sont interrogés simultanément. En complément, une précision technique est donnée sur l’effet des doublons et sur la différence de résultats entre approches JOIN et agrégation, avec des ajustements possibles via IN ou EXISTS.

Bobot (l’IA à votre service)
  1. non je sais pas...c'est pas grave tu m'as déjà beaucoup aidé...c'est vraiment très gentil de ta part...j'espere elle sera juste maintenant :-p
    1. j' ai jamais fais de requête avec les "join" mais rajouter inner devant nan ?
      1. Vous savez quoi j'ai peut-etre mal regardé...jpense que c'est bon en fait...

        maintenant si vous pouviez me répondre à une deuxieme petite question...je dois faire cette question avec le JOIN et l'agregation...

        Trouver les inscrits au cours de NATATION I et de NATATION II

        j'ai

        select distinct Inscrit.*,Cours.NomCours
        from INSCRIT,PARTICIPATION,COURS
        where Inscrit.Nocarte=Participation.Nocarte
        and Participation.NomCours=Cours.NomCours
        and Cours.NomCours='NatationI'or Cours.NomCours='NatationII'

        et

        select Inscrit.*,Cours.NomCours
        from (INSCRIT join PARTICIPATION on Inscrit.Nocarte=Participation.Nocarte)
        join Cours on Participation.NomCours=Cours.NomCours
        where Cours.NomCours='NatationI'or Cours.NomCours='NatationII'

        les deux marchent mais ne donnent pas le même résultat pk ?
        1. Si elle est bonne la requete! Maintenant a toi d'alimenter ta BDD pour que cette requete fonctionne avec plusieurs exemple....
          1. tu es sur d'avoir au moins un résultat correspondant à ta requête ???
            Et essayes de virer toutes ces parenthèses dans le having
            1. SELECT I.NoCarte, Nom, COUNT(I.NoCarte)
              FROM COURS C, INSCRIT I, PARTICIPATION P
              WHERE C.NomCours = P.NomCours
              AND I.NoCarte = P.NoCarte
              AND Nom ='Bonnard'
              GROUP BY I.NoCarte, Nom
              HAVING (((COUNT(I.NoCarte)> 1)))

              Là je n'ai aucun problème mais jpense pas que ce soit la réponse...car ça ne me trouve aucune personne...
              1. La derniere requete est avec le GROUP BY...et ça ne marche pas non plus..apparement le pb vient du SUM
                1. Non pas besoin de sous requête, quelle est la derniere requête que tu as testée ?
                  As tu essayé avec le group by ?
                  1. non non lol

                    j'espere que je vous embête pas trop...faut peut-être une sous-requête non ? car jai fait ça question précédente :

                    select Nom,Age
                    from INSCRIT
                    Where Age>( select Age
                    from Inscrit
                    where Nom='Bonnard')
                    1. SELECT I.NoCarte, Nom, COUNT(I.NoCarte)
                      FROM COURS C, INSCRIT I, PARTICIPATION P
                      WHERE C.NomCours = P.NomCours
                      AND I.NoCarte = P.NoCarte
                      AND Nom ='Bonnard'
                      GROUP BY I.NoCarte, Nom
                      HAVING (((SUM(I.NoCarte)> 1)));
                      1. Il me semble que quand on utilises un Having on es censé utiliser un group by donc fais un truc comme ca :
                        GROUP BY NoCarte ASC 
                        HAVING (((COUNT(I.NoCarte)> 1))); 
                        
                        
                        1. En remplaçant le SUM par le COUNT j'ai ça :

                          Msg 8120, Niveau 16, État 1, Ligne 1
                          La colonne 'INSCRIT.Nocarte' n'est pas valide dans la liste de sélection parce qu'elle n'est pas contenue dans une fonction d'agrégation ou dans la clause GROUP BY.

                          sinon en le laissant :

                          Msg 8117, Niveau 16, État 1, Ligne 1
                          Le type de données de l'opérande char n'est pas valide pour l'opérateur sum.
                          1. Avec la mienne ça devrai marcher^^

                            SELECT I.NoCarte, Nom, COUNT(I.NoCarte)
                            FROM COURS C, INSCRIT I, PARTICIPATION P
                            WHERE C.NomCours = P.NomCours
                            AND I.NoCarte = P.NoCarte
                            AND Nom ='Bonnard'
                            HAVING (((SUM(I.NoCarte)> 1)));
                            • 1
                            • 2