IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Requêtes et SQL. Discussion :

PB SQL: INNER JOIN / LEFT JOIN?


Sujet :

Requêtes et SQL.

  1. #1
    Membre du Club
    Inscrit en
    Décembre 2010
    Messages
    71
    Détails du profil
    Informations forums :
    Inscription : Décembre 2010
    Messages : 71
    Points : 47
    Points
    47
    Par défaut PB SQL: INNER JOIN / LEFT JOIN?
    Bonjour à tous,

    Je me permets de solliciter vos compétences car je n'arrive pas à trouver de solution à mon problème (qui doit être relativement simple, mais je suis encore débutant en SQL). Voici l'énoncé:

    J'ai deux tables. La table FU est la table référentielle, et la table PROD est une table à laquelle des données sont ajoutées. J'aimerais (via SQL) identifier, pour tous les enregistrements contenus dans PROD, les doublons les doublons existants dans la table FU en excluant les enregistrements de la table PROD. Voici un exemple:


    Nom : TEST.PNG
Affichages : 266
Taille : 3,3 Ko


    Le résultat devrait être: Y1,Y2,Z3.

    Voici la requête que j'utilise:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    SELECT FU.ID,FU.ISIN ,FU.CLIENT,FU.SDG 
    FROM FU  LEFT JOIN  PROD
    ON FU.ISIN=PROD.ISIN
    WHERE FU.ISIN=PROD.ISIN
    AND FU.CLIENT<>PROD.CLIENT
    Cette requête semble fonctionner quand je n'ai qu'un seul client par code. Dès que j'ai deux clients pour un même code, la requête m'affiche les doublons alors que j'aimerais avoir 0 enregistrement. Pour être plus précis, si j'ajoute les Y1,Y2,Z3 à la table prod, si la requête est relancée j'aimerais obtenir 0 enregistrement, car tous les codes/client sont déjà dans PROD, donc il n'y a plus de doublons. Cependant dans l'état actuel des choses, cette requête me sort tous les enregistrements comme si c'était un INNER JOIN.

    Any idea?

    merci d'avance pour votre aide,

  2. #2
    Modérateur
    Avatar de kolodz
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2008
    Messages
    2 211
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Avril 2008
    Messages : 2 211
    Points : 8 316
    Points
    8 316
    Billets dans le blog
    52
    Par défaut
    Bonjour,

    Je pense que tu cherche à avoir un INNER JOIN. Cependant, le problème n’étant pas super précis. Je te donne la logique associée :

    Si tu veux que ta clé soit présent à la fois dans la table PROD et FU, il te faut un INNER JOIN.

    Si tu veux que ta clé soit uniquement présent dans la table FU il te faut un [c]left join[c] où FU est la table maitre.

    Au pire, crée deux tables tests avec quelques enregistrements pour vérifier que tu as bien le comportement voulu.

    Cordialement,
    Patrick Kolodziejczyk.

  3. #3
    Membre du Club
    Inscrit en
    Décembre 2010
    Messages
    71
    Détails du profil
    Informations forums :
    Inscription : Décembre 2010
    Messages : 71
    Points : 47
    Points
    47
    Par défaut
    Bonjour,
    Merci pour ta réponse. J'ai aussi essayé avec un inner join, mais j'ai un résultat similaire. Au lien d'avoir 0 enregistrement, j'ai la liste des doublons existants.

  4. #4
    Community Manager

    Avatar de Malick
    Homme Profil pro
    Community Manager
    Inscrit en
    Juillet 2012
    Messages
    9 219
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Sénégal

    Informations professionnelles :
    Activité : Community Manager
    Secteur : Conseil

    Informations forums :
    Inscription : Juillet 2012
    Messages : 9 219
    Points : 85 103
    Points
    85 103
    Billets dans le blog
    15
    Par défaut


    @NewYork De mon côté je ne pense pas avoir bien compris tes explications.

    Citation Envoyé par NewYork Voir le message
    Bonjour à tous,

    Le résultat devrait être: Y1,Y2,Z3.
    Voici un exemple de rendu avec cette requête :

    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT FU.*
    FROM FU LEFT JOIN PROD ON FU.Client=PROD.Client
    WHERE (((PROD.Client) Is Null))
    ORDER BY PROD.Client;


    La base de test :
    Fichiers attachés Fichiers attachés

  5. #5
    Modérateur
    Avatar de kolodz
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2008
    Messages
    2 211
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Avril 2008
    Messages : 2 211
    Points : 8 316
    Points
    8 316
    Billets dans le blog
    52
    Par défaut
    HS : On pense beaucoup, mais on comprends pas grand chose

  6. #6
    Membre du Club
    Inscrit en
    Décembre 2010
    Messages
    71
    Détails du profil
    Informations forums :
    Inscription : Décembre 2010
    Messages : 71
    Points : 47
    Points
    47
    Par défaut
    Désolé pour les explications douteuses.

    Voici un schéma qui j'espère sera plus clair:

    Nom : test2.PNG
Affichages : 270
Taille : 10,6 Ko


    En gros (i) il faudrait que la requête identifie les ISIN contenus dans PROD, (ii) trouve tous les codes correspondants dans FU (liste de prod + doublons dans FU) et (iii) affiche les résultats en excluant les codes de PROD.

    Je ne sais pas si c'et plus clair mais je l'espère

  7. #7
    Community Manager

    Avatar de Malick
    Homme Profil pro
    Community Manager
    Inscrit en
    Juillet 2012
    Messages
    9 219
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Sénégal

    Informations professionnelles :
    Activité : Community Manager
    Secteur : Conseil

    Informations forums :
    Inscription : Juillet 2012
    Messages : 9 219
    Points : 85 103
    Points
    85 103
    Billets dans le blog
    15
    Par défaut
    Avec cette requête, vous avez le résultat escompté :

    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT FU.Client, FU.ISIN
    FROM FU, PROD
    WHERE FU.ISIN=PROD.ISIN AND FU.CLIENT<>PROD.CLIENT;

    Base de test :
    Fichiers attachés Fichiers attachés

  8. #8
    Membre du Club
    Inscrit en
    Décembre 2010
    Messages
    71
    Détails du profil
    Informations forums :
    Inscription : Décembre 2010
    Messages : 71
    Points : 47
    Points
    47
    Par défaut
    En effet, cela marche très bien quand il n'y a qu'un code/client. Le problème qui se pose est quand j'ajoute la liste obtenue par la requête à la table prod. Voici le résultat de la requête une fois les ajouts effectués

    Nom : test3.PNG
Affichages : 246
Taille : 6,2 Ko


    Mon objectif serait d'avoir 0 valeurs or tous les doublons sont affichés.

    Peut-être faudrait-il passer par du vb plutôt que du SQL?

  9. #9
    Community Manager

    Avatar de Malick
    Homme Profil pro
    Community Manager
    Inscrit en
    Juillet 2012
    Messages
    9 219
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Sénégal

    Informations professionnelles :
    Activité : Community Manager
    Secteur : Conseil

    Informations forums :
    Inscription : Juillet 2012
    Messages : 9 219
    Points : 85 103
    Points
    85 103
    Billets dans le blog
    15
    Par défaut
    Vous pouvez créer une deuxième requête R_Controle qui se chargera de faire le contrôle, comme ceci :

    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT FU.Client, FU.ISIN
    FROM FU LEFT JOIN PROD ON FU.Client = PROD.Client
    WHERE (((PROD.Client) Is Null));

    Exemple :
    Fichiers attachés Fichiers attachés

  10. #10
    Membre du Club
    Inscrit en
    Décembre 2010
    Messages
    71
    Détails du profil
    Informations forums :
    Inscription : Décembre 2010
    Messages : 71
    Points : 47
    Points
    47
    Par défaut
    Bonjour,
    Malheureusement ça ne fonctionne pas non plus.
    Je vais essayer de le coder en vba afin de voir si je trouve une solution.
    Merci à tous pour vos commentaires et votre aide.

Discussions similaires

  1. INNER et LEFT JOIN
    Par Beaudelicius dans le forum Langage SQL
    Réponses: 5
    Dernier message: 07/11/2011, 14h47
  2. INNER JOIN, LEFT JOIN
    Par Mitaka dans le forum Requêtes
    Réponses: 27
    Dernier message: 24/03/2009, 16h52
  3. left join , right join et inner join ?
    Par amine003 dans le forum Langage SQL
    Réponses: 3
    Dernier message: 05/12/2008, 17h25
  4. Jointures INNER JOIN LEFT JOIN
    Par tizla dans le forum Requêtes et SQL.
    Réponses: 10
    Dernier message: 31/05/2007, 12h12
  5. [SQL][10.g]left join? + algèbre
    Par RB Greg dans le forum Oracle
    Réponses: 4
    Dernier message: 31/05/2005, 16h20

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo