|
Publicité | ||||||||||||||||||||||
|
|
#1 | ||
|
Futur Membre du Club
![]() Inscription : mai 2006 Messages : 49 ![]() |
Bonjour à tous,
J'ai un problème de compréhension sur les JOINTURE ou JOIN. J'optimise actuellement mes requêtes et voici le problème: Je cherche à savoir quels sont les enregistrements dans la table "mandats" dont la réf ne se trouvent pas dans la table "annonces". La réponse est 2, mais j'obtiens une boucle de 716 réponses (soit 2 fois le nombre d'enr. de "annonces"). Pouvez-vous m'aider sur cette requête? Code :
|
||
|
|
00
|
|
|
#2 | ||
![]() ![]() Cédric DuprezInscription : avril 2002 Messages : 3 776 ![]() |
Bonjour,
Dans la requête que tu donnes, ce que tu fais, c'est une non-équijointure qui, pour chaque num_mdt va associer toutes les ref qui lui sont différentes. En fait, pour obtenir ce que tu cherches, il faut plutôt faire comme ça : Code :
__________________
Rédacteur / Modérateur SGBD Mes tutoriels et la FAQ MySQL ---------------------------------------------------- Pensez aux balises code et au tag Je ne réponds pas aux questions techniques par message privé, les forums sont là pour ça
|
||
|
|
00
|
|
|
#3 | ||
|
Futur Membre du Club
![]() Inscription : mai 2006 Messages : 49 ![]() |
Merci beaucoup de ta réponse.
En fait je n'ai précisé que dans la table "annonces" toutes les lignes ont une ref non nulle. Je cherche a identifier quand "a.num_mdt" n'est pas égale à "b.ref" pour extraire "a.num_mdt"... Peux-tu m'aider, j'ai tenté le code ci-dessous mais 0 réponse et j'en attends 2? Code :
|
||
|
|
00
|
|
|
#4 | ||
![]() ![]() |
Citation:
Citation:
LEFT JOIN retourne toutes les lignes de la table de gauche (ici, la table mandats) et donne la correspondance si elle existe dans la table de droite (ici, annonces). S'il n'y a pas de correspondance dans la table de droite, les colonnes de cette dernière afficheront NULL. Et comme la requête cherche précisément ces NULL, le résultat est que la requête ne doit retourner que les numéros de mandats qui n'existent pas dans la colonne ref de la table des annonces.
__________________
Philippe Leménager. Ingénieur d'étude à l'École Nationale de Formation Agronomique. Mon blog sur la conception des BDD, le langage SQL, le PHP avec Zend Framework... « Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau) À la maison comme au bureau, j'utilise Mandriva Linux ou Mageïa ! Soutenons l'industrie logicielle française ! Linuxiens, comptez-vous ! |
||
|
00
|
|
|
#5 | |||
|
Futur Membre du Club
![]() Inscription : mai 2006 Messages : 49 ![]() |
Bonjour CinePhil,
Citation:
Je ne comprend pas pourquoi le WHERE contient "b.ref IS NULL" dans la mesure ou ce champs n'est jamais NULL dans ma table. Ma requete doit trouver si 'a.num_mdt' n'a aucune correspondance dans 'b.ref'. En décomposant 2 requêtes, cela donnerait : Code :
Merci de ton aide. |
|||
|
|
00
|
|
|
#6 | |||||
![]() ![]() |
Citation:
![]() Soit la table A (a_id, a_libelle) et la table B (b_id, b_fk_id_A, b_nom) où b_fk_id_A est une clé étrangère faisant référence à l'identifiant a_id de la table A. Dans A il y a ces lignes : a_id / a_libelle 1 / MySQL 2 / Oracle 3 / Postgresql Dans B il y a ces lignes : b_id / b_fk_id_A / b_nom 1 / 1 / Bernard 2 / 1 / Michel 3 / 3 / Philippe => On voit que la valeur 2 n'existe pas pour la colonne b_fk_id_A. Faisons-une jointure externe entre les deux tables : Code :
a_id / a_libelle / b_id / b_fk_id_A / b_nom 1 / MySQL / 1 / 1 / Bernard 1 / MySQL / 2 / 1 / Michel 2 / Oracle / NULL / NULL / NULL 3 / Postgresql / 3 / 3 / Philippe Tu vois les NULL ? Et pourtant toutes les lignes de B ont un b_fk_id_A ! Tu peux tester ça très facilement chez toi ! Donc si je veux connaître les a_id non présents dans B, il suffit d'ajouter à la requête précédente un WHERE qui recherche ces NULL ! Code :
a_id / a_libelle / b_id / b_fk_id_A / b_nom 2 / Oracle / NULL / NULL / NULL
__________________
Philippe Leménager. Ingénieur d'étude à l'École Nationale de Formation Agronomique. Mon blog sur la conception des BDD, le langage SQL, le PHP avec Zend Framework... « Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau) À la maison comme au bureau, j'utilise Mandriva Linux ou Mageïa ! Soutenons l'industrie logicielle française ! Linuxiens, comptez-vous ! |
|||||
|
00
|
|
|
#7 | ||
|
Futur Membre du Club
![]() Inscription : mai 2006 Messages : 49 ![]() |
re CinePhil,
Me revoici après de longs essais. J'ai du lire de nombreux tuto et en suivant tes conseils ci-dessus et ce tuto (http://sqlpro.developpez.com/cours/sqlaz/jointures/) je penses avoir compris Ta solution n'a pas fonctionnée et je pense que le code ci-dessous est OK. Il me donne actuellement les bons résultats après quelques tests. Qu'en penses-tu? Code :
Merci encore.
|
||
|
|
00
|
Copyright © 2000-2012 - www.developpez.com