Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1147 connectés 

  FORUM HardWare.fr
  Programmation
  SQL/NoSQL

  Pb de jointure

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

Pb de jointure

n°1708779
babasse35
Posté le 27-03-2008 à 16:01:59  profilanswer
 

Bonjour,
j'ai un problème sur une requête. Je cherche à faire une jointure entre plusieurs tables, mais je n'arrive pas à obtenir le résultat souhaité.
En fait, mon problème vient du fait que le champ sur lequel je fais la jointure peut être vide.
 

Code :
  1. select a.id, a.note, b.mention
  2. from etudiant a, mentions b
  3. where a.note = b.note


 
j'ai également essayé de cette façon
 

Code :
  1. select a.id, a.note, b.mention
  2. from etudiant a
  3. left join mentions b
  4. on a.note = b.note


 
Dans les 2 cas, je ne récupère que les données ayant une note, alors que la note n'est pas toujours remplie. Je voudrai juste que la mention soit ajoutée lorsque la note est renseignée.
 
Merci d'avance pour votre aide

mood
Publicité
Posté le 27-03-2008 à 16:01:59  profilanswer
 

n°1708792
Harkonnen
Modérateur
Un modo pour les bannir tous
Posté le 27-03-2008 à 16:14:24  profilanswer
 

revois la structure de ta table "mentions" : visiblement elle n'a pas de clé primaire. créé en une, puis met la en clé étrangère de ta table "etudiant" et fais ta jointure dessus. ça marchera beaucoup mieux

n°1708902
babasse35
Posté le 27-03-2008 à 19:00:06  profilanswer
 

Merci pour ta réponse, mais je pense quel e problème ne vient pas. C'est le fait que la note ne soit pas remplie qui pose le problème au niveau de la jointure. Je voudrai que lorsqu'il n'y a pas de note, la ligen soit tout de même affichée, même sans mention.
Merci d'avance

n°1709014
MagicBuzz
Posté le 28-03-2008 à 02:12:44  profilanswer
 

Je pige pas trop ce qui coince.
Sur le coup j'ai pensé à un problème de sens dans ta jointure (pour la seconde requête) mais non, c'est bien un left qu'il te faut...
 
Mon test :

Code :
  1. CREATE TABLE etudiant
  2. (
  3.  id numeric PRIMARY KEY NOT NULL,
  4.  note int NULL
  5. )
  6. go
  7.  
  8. CREATE TABLE mention
  9. (
  10.  note int PRIMARY KEY NOT NULL,
  11.  libelle varchar(50) NOT NULL
  12. )
  13. go
  14.  
  15. INSERT INTO mention (note, libelle) VALUES (10, 'Très bien');
  16. INSERT INTO mention (note, libelle) VALUES (9, 'Bien');
  17. INSERT INTO mention (note, libelle) VALUES (8, 'Bien');
  18. INSERT INTO mention (note, libelle) VALUES (7, 'Assez bien');
  19. INSERT INTO mention (note, libelle) VALUES (6, 'Assez bien');
  20. INSERT INTO mention (note, libelle) VALUES (5, 'Passable');
  21.  
  22. INSERT INTO etudiant (id, note) VALUES (1, 10);
  23. INSERT INTO etudiant (id, note) VALUES (2, 9);
  24. INSERT INTO etudiant (id, note) VALUES (3, NULL);
  25. INSERT INTO etudiant (id, note) VALUES (4, 7);
  26. INSERT INTO etudiant (id, note) VALUES (5, 6);
  27. INSERT INTO etudiant (id, note) VALUES (6, NULL);
  28. INSERT INTO etudiant (id, note) VALUES (7, 4);
  29. INSERT INTO etudiant (id, note) VALUES (8, 3);
  30. INSERT INTO etudiant (id, note) VALUES (9, NULL);
  31. INSERT INTO etudiant (id, note) VALUES (10, 1);
  32. INSERT INTO etudiant (id, note) VALUES (11, 0);
  33.  
  34. SELECT e.id, e.note, m.libelle
  35. FROM etudiant e
  36. INNER JOIN mention m ON m.note = e.note;
  37.  
  38. SELECT e.id, e.note, m.libelle
  39. FROM etudiant e
  40. LEFT OUTER JOIN mention m ON m.note = e.note;
  41.  
  42. SELECT e.id, e.note, m.libelle
  43. FROM etudiant e
  44. RIGHT OUTER JOIN mention m ON m.note = e.note;


 
Le résultat :


id                                      note        libelle
--------------------------------------- ----------- --------------------------------------------------
1                                       10          Très bien
2                                       9           Bien
4                                       7           Assez bien
5                                       6           Assez bien
 
(4 ligne(s) affectée(s))
 
id                                      note        libelle
--------------------------------------- ----------- --------------------------------------------------
1                                       10          Très bien
2                                       9           Bien
3                                       NULL        NULL
4                                       7           Assez bien
5                                       6           Assez bien
6                                       NULL        NULL
7                                       4           NULL
8                                       3           NULL
9                                       NULL        NULL
10                                      1           NULL
11                                      0           NULL
 
(11 ligne(s) affectée(s))
 
id                                      note        libelle
--------------------------------------- ----------- --------------------------------------------------
NULL                                    NULL        Passable
5                                       6           Assez bien
4                                       7           Assez bien
NULL                                    NULL        Bien
2                                       9           Bien
1                                       10          Très bien
 
(6 ligne(s) affectée(s))
 


 
(le right outer join marche aussi, sauf que si une note n'a pas de mention, alors t'as pas de ligne...)


Message édité par MagicBuzz le 28-03-2008 à 02:13:32
n°1710158
babasse35
Posté le 31-03-2008 à 11:17:37  profilanswer
 

Merci pour ta réponse.
En fait, c'est au résultat de ta seconde requête que je veux arriver.
En fait, je crois que ce qui déconne chez moi, c'est que je n'ai pas "NULL" comme valeur mais pas de valeur du tout.
Du coup ça me donne ça comme résultat et non ton résultat :
id                                      note        libelle  
--------------------------------------- ----------- --------------------------------------------------  
1                                       10          Très bien  
2                                       9           Bien  
4                                       7           Assez bien  
5                                       6           Assez bien  
7                                       4           NULL  
8                                       3           NULL  
10                                      1           NULL  
11                                      0           NULL  
 
Est-ce qu'il y a un moyen de contourner ce problème (sans rajouter "NULL" dans mes champs vides...) ?
 
Merci d'avance

n°1710222
MagicBuzz
Posté le 31-03-2008 à 12:08:56  profilanswer
 

"pas de valeur du tout", c'est justement NULL.
je dirais plutôt que ton problème, c'est que t'as une donnée (genre chaîne vide ou 0...)

n°1710448
babasse35
Posté le 31-03-2008 à 16:13:36  profilanswer
 

ok, merci.
Mais dans ce cas si j'ai une valeur (chine vide ou 0), pourquoi est-ce que la ligne n'apparait pas avec le left join ?
Désolé si certaines de mes questions ne sont pas très claires...
Merci d'avance

n°1710544
MagicBuzz
Posté le 31-03-2008 à 17:49:46  profilanswer
 

parceque le left join ne permet de retrouver des lignes que si elles n'existent pas, ou sont identiques. si elles sont différentes, il ne les retourne pas, et c'est normal

n°1710582
babasse35
Posté le 31-03-2008 à 18:48:02  profilanswer
 

ok
Et est-ce ce qu'un autre type de jointure que le left join pourrait me donner ce que je recherche ?

n°1710636
MagicBuzz
Posté le 31-03-2008 à 20:51:12  profilanswer
 

non
 
tu dois faire en sorte de traîter tes valeurs chaîne vide et zéro comme si elles n'existaient pas.
 
dans quelle table tu as ces lignes ?

mood
Publicité
Posté le 31-03-2008 à 20:51:12  profilanswer
 

n°1711049
casimimir
Posté le 01-04-2008 à 15:30:25  profilanswer
 

c'est pas juste un left outer join a la place de left join qu'il lui faudrait?

n°1711202
MagicBuzz
Posté le 01-04-2008 à 18:39:27  profilanswer
 

"left join" est juste une version condensée de la syntaxe standard SQL "left outer join", ça ne change rien au comportement


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  SQL/NoSQL

  Pb de jointure

 

Sujets relatifs
Jointure externe?[SQL Server] Jointure avec valeur de champ comme nom de table
SQl pourquoi plusieurs type de jointureRequête avec jointure externe
[MySQL] Problème avec Jointure ( et plusieurs COUNT sur même table)Probème de requête avec jointure externe
Jointure optionnelleProblème de jointure
Problème avec une jointure[resolu]Besoin d'aide pour jointure sur mySQL
Plus de sujets relatifs à : Pb de jointure


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR