Problème avec requêtes SQL

Problème avec requêtes SQL - Aide aux devoirs - Emploi & Etudes

Marsh Posté le 12-02-2010 à 13:25:11    

Bonjour à tous,
 
Voilà je suis en cours du soir au CNAM et je vais bientôt passer un examen sur les SGBD. Pour cela je m'entraine avec avec pas mal d'annales.
 
J'ai quelques souci avec deux requêtes :
 
1)Voilà l'énoncé du premier exercice:
 
Bateau (Num_Bat, NomB, Sponsor) ;
Course (Num_Cou, NomC, Date, Prix) ;
Resultat (Num_Bat, Num_Cou, Score) ;
 
Voici la question : Donner pour chaque nom de bateau, le nombre de ses participations à une course ?
 
Correction :
 
SELECT NomB, Count(*)
FROM Bateau B, Course C
WHERE B.Num_Bat = C.Num_Bat
GROUP BY NomB ;
 
Je ne comprend pas pourquoi il y a une jointure "B.Num_Bat = C.Num_Bat" alors que Num_Bat n'apparait même pas dans la table Course
 
Moi j'aurais mis cela :
 
SELECT NomB, Count(*)
FROM Bateau B, Course C, Resultat R
WHERE B.Num_Bat = R.Num_Bat
AND R.Num_Cou = C.Num_Cou
GROUP BY NomB ;
 
Please quelqu'un peu m'expliquer pourquoi j'ai faux ?  :??:  
 
 
2)Voilà l'énoncé du deuxième exercice:
 
AEROPORTS (Code, Nom, Pays)
AVIONS (Ref, Type, Compagnie, NB_Passagers)
VOLS (Ref, Date_Depart, Depart, Arrivée, Date_Arrivée, Distance)
VOYAGEURS (ref_Client, Nom, Prenom, Nationalité, Kilométrage)
RESERVATIONS (ref, Date_Depart, Ref_client, Classe)
 
Voici ce que l'on nous demande : Donnez les pays de destination pour tous les départs de l'aéroports de code 'CDG' le 14 juillet 2008 ?
 
Voici la correction que l'on nous donne :
 
SELECT A.Pays
FROM VOLS V, AEROPORTS A,
WHERE V.Arrivee=A.Code
AND V.Depart='CDG'
AND V.Date_Depart>='2008-07-14 00:00:00'
AND V.Date Depart <'2008-07-15 00:00:00';
 
Ce que je ne comprend pas c'est comment on peu faire une jointure comme "V.Arrivee=A.Code" !! Je pensais que la jointure était uniquement entre deux attributs commun à deux table !!! Est-ce que quelqu'un peu m'expliquer  
 
D'avance merci pour vos réponses et merci d'avoir pris le temps de m'expliquer  ;)

Message cité 2 fois
Message édité par doh-ko le 12-02-2010 à 19:06:31
Reply

Marsh Posté le 12-02-2010 à 13:25:11   

Reply

Marsh Posté le 12-02-2010 à 13:28:47    

tu trouveras ptet des réponses ici, mais à mon avis tu aurais plus de chances d'avoir une réponse rapide dans la cat Programmation :o


---------------
Tell me why all the clowns have gone.
Reply

Marsh Posté le 12-02-2010 à 13:38:37    

Merci je vais essayer de la poser la-bas

Reply

Marsh Posté le 12-02-2010 à 13:42:07    

doh-ko a écrit :

Correction :
 
SELECT NomB, Count(*)
FROM Bateau B, Course C
WHERE B.Num_Bat = C.Num_Bat
GROUP BY NomB ;
 
Je ne comprend pas pourquoi il y a une jointure "B.Num_Bat = C.Num_Bat" alors que Num_Bat n'apparait même pas dans la table Course


Effectivement, cette requete ne peut pas fonctionner...
 

doh-ko a écrit :


Moi j'aurais mis cela :
 
SELECT NomB, Count(*)
FROM Bateau B, Course C, Resultat R
WHERE B.Num_Bat = R.Num_Bat
AND R.Num_Cou = C.Num_Cou
GROUP BY NomB ;
 
Please quelqu'un peu m'expliquer pourquoi j'ai faux ?  :??:  
 


Comme ca, ca m'a pas l'air mal, as tu essayer ta requete ? Pkoi penses tu avoir faux ?
 

doh-ko a écrit :


Ce que je ne comprend pas c'est comment on peu faire une jointure comme "V.Arrivee=A.Code" !! Je pensais que la jointure était uniquement entre deux attributs commun à deux table !!! Est-ce que quelqu'un peu m'expliquer  
 
D'avance merci pour vos réponses et merci d'avoir pris le temps de m'expliquer  ;)  


 
Ben la jointure se fait bien sur l'attribut du code de l'aeroport, seulement dans une table il s'appelle code, dans la seconde, c'est Arrivee. Après il faut qu'il ait le même type, mais pas forcément le même nom.
 
sur cette requete, j'aurais fais un select distinct A.Pays  pour eviter les doublons du aux différents aéroports dans le même pays

Reply

Marsh Posté le 12-02-2010 à 13:46:35    

La réponse correcte pour le premier exo me semble être la tienne.
 
Pour le 2eme, celle du prof est bonne. On part du postulat qu'un vol a un aéroport de départ et un d'arrivée. Donc, plutot que d'avoir le nom de l'aeroport de depart et celui d'arrivée dans la table VOLS, on stocke les codes de ces deux aéroports (sinon, que se passerait-il si l'aéroport de Laon, par exemple, était renommé en aéroport de Chambry ?).
 
 
Donc les colonnes Depart et Arrivée de VOLS correspondent à des codes aéroports (clés étrangères vers la table AEROPORTS).
 

Reply

Marsh Posté le 12-02-2010 à 13:52:05    

seb0uil a écrit :


Comme ca, ca m'a pas l'air mal, as tu essayer ta requete ? Pkoi penses tu avoir faux ?
 


Je pense qu'en effet, le mieux est de t'installer un SGBD gratuit (mysql, par exemple), de te créer les tables, de les peupler avec des données puis de tester toi-même tes requêtes. Et de faire mumuse même en t'inventant des énoncés "un peu plus tordus".

Reply

Marsh Posté le 12-02-2010 à 13:53:46    

doh-ko a écrit :


Moi j'aurais mis cela :
 
SELECT NomB, NomC, Count(*)
FROM Bateau B, Course C, Resultat R
WHERE B.Num_Bat = R.Num_Bat
AND R.Num_Cou = C.Num_Cou
GROUP BY NomB, NomC ;
 


 
En relisant, et pour coller un peu plus a la question, j'imagine qu'il faut indiquer pour chaque bateau, son nom, et son nombre de participation aux différentes courses, en séparant les courses, et non pas son nombre de participation totale toutes courses confondues

Reply

Marsh Posté le 12-02-2010 à 14:20:22    

Dans la 1, il doit y avoir une erreur dans les tables, ca serait plutot:
FROM Bateau B, Resultat C comme on veut juste le nombre de participation a la course, si il y a un resultat c'est qu'il y participation.
Ta reponse est correcte mais il y a une jointure inutile alors c'est moins optimise, ca passe pour des petites tables mais ca coute cher en cpu sur des tres grosses.
 
La 2, la reponse a ete donnee.

Reply

Marsh Posté le 12-02-2010 à 19:33:03    

Merci à tous pour vos réponses  
 
Crashsystem> Effectivement si je pense aussi qu'on pourrait se passer de la table Course et donc de la jointure "R.Num_Cou = C.Num_Cou " mais si j'ai mis ça s'était pour coller un peu plus à la correction car je me demandais vraiment pour il pouvait y avoir une jointure pareil "B.Num_Bat = C.Num_Bat "
 
John cleese> Tu voulais peu être plutôt mettre ça ou j'ai rien compris ?

Citation :

Pour le 2eme, celle du prof est bonne. On part du postulat qu'un vol a un aéroport de départ et un d'arrivée. Donc, plutot que d'avoir le nom de l'aeroport de depart et celui d'arrivée dans la table AEROPORTS, on stocke les codes de ces deux aéroports (sinon, que se passerait-il si l'aéroport de Laon, par exemple, était renommé en aéroport de Chambry ?).


 
SebOuil et John cleese> Donc en fait ce qu'il fallait comprendre c'est que les valeurs des attributs "Code" et "Arrivée" sont les même !!! Je comprend mieux effectivement la jointure "V.Arrivee=A.Code" mais franchement sans avoir un exemple de valeurs sous les yeux je ne vois pas comment je pouvais deviner avec l'ennoncé !!! Un peu tendu comme piège
 
SebOuil>Effectivement on pourrait faire ça serait pas mal mais là je pense que ce n'était pas trop demandé mais du coup la proposition de Crashsystem ne serait plus bonne
 
En tout cas merci à vous les gas, j'ai des réponses 10 fois plus rapidement que sur le forum pleiad  ;)


Message édité par doh-ko le 12-02-2010 à 19:41:23
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed