Pb de jointure

Pb de jointure - SQL/NoSQL - Programmation

Marsh Posté le 27-03-2008 à 16:01:59    

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

Reply

Marsh Posté le 27-03-2008 à 16:01:59   

Reply

Marsh Posté le 27-03-2008 à 16:14:24    

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

Reply

Marsh Posté le 27-03-2008 à 19:00:06    

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

Reply

Marsh Posté le 28-03-2008 à 02:12:44    

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
Reply

Marsh Posté le 31-03-2008 à 11:17:37    

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

Reply

Marsh Posté le 31-03-2008 à 12:08:56    

"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...)

Reply

Marsh Posté le 31-03-2008 à 16:13:36    

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

Reply

Marsh Posté le 31-03-2008 à 17:49:46    

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

Reply

Marsh Posté le 31-03-2008 à 18:48:02    

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

Reply

Marsh Posté le 31-03-2008 à 20:51:12    

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 ?

Reply

Marsh Posté le 31-03-2008 à 20:51:12   

Reply

Marsh Posté le 01-04-2008 à 15:30:25    

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

Reply

Marsh Posté le 01-04-2008 à 18:39:27    

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

Reply

Sujets relatifs:

Leave a Replay

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