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

Langage SQL Discussion :

Problème de doublon dans le résultat d'une requete avec jointure


Sujet :

Langage SQL

  1. #1
    Membre habitué
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    130
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 130
    Points : 127
    Points
    127
    Par défaut Problème de doublon dans le résultat d'une requete avec jointure
    Bonjour à tous.
    j'ai un problème avec une jointure sur deux tables que je n'arrive pas à résoudre.

    J'ai une table, IMBIENS, qui comprend des enregistrements de produits.
    J'ai une autre table, IMMEDIAS, qui comprend les médias correspants à chaque produit.
    Un produit peut n'avoir aucun media associé, comme une infinité (normalement 32 pour le moment, mais infini à théorie).
    Les tables sont reliées par un champ qui s'appele BICOD, qui est identique sur les deux tables et qui représente le code de l'enregistrement dans IMBIENS.

    Le but, c'est de récupérer les infos dans la base IMBIENS (le code dans l'exemple donné ci-dessous, mais une 10aine d'autres en réalité) plus le média numéro 1 seulement.

    J'ai donc fait cette requete sur les deux tables:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    SELECT DISTINCT IMBIENS.BICOD AS BICOD,IMMEDIAS.MEDCHEMIN AS MEDCHEMIN FROM IMBIENS LEFT JOIN IMMEDIAS ON IMBIENS.BICOD = IMMEDIAS.BICOD 
    WHERE (IMBIENS.BIVENTE = 0 AND IMBIENS.BIANNULE = 0 AND IMBIENS.BICOD IS NOT NULL AND IMBIENS.BITYPOP = 1)  AND MEDTYPE = 1 AND MEDNUM = 1 order by bicod asc
    Qui me renvoie ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    BICOD       |     MEDCHEMIN
    ----------------------------
       1018      |          NULL
       1022      |          NULL
       1022      |          1022_1.JPG
       1025      |          NULL
       1025      |          1025_1.JPG
       1029      |          NULL
       1029      |          1029_1.JPG
       1044      |          NULL
       1044      |          1044_1.JPG
    etc ...
    Le problème vient des doubles enregistrements renvoyés, un avec MEDCHEMIN à NULL, et un avec la valeur recherchée.

    J'essai de supprimer celui avec la valeur nulle, mais je n'y arrive pas.

    Si quelqu'un a une idée ...

    Merci d'avance.

    PS: J'ai oublié de préciser que tout ceci se passe sur le Serveur de Base de Données Hyperfile de PCSOFT.

  2. #2
    Membre averti
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    254
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Avril 2007
    Messages : 254
    Points : 304
    Points
    304
    Par défaut
    En rajoutant "AND MEDCHEMIN IS NOT NULL" dans le where clause?
    Quand un problème a une solution, rien ne sert de s'inquiéter. Quand il n'y a pas de solution, s'inquiéter n'arrange rien.

  3. #3
    Membre habitué
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    130
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 130
    Points : 127
    Points
    127
    Par défaut
    Salut, j'ai essayé déjà, mais le résultat est identique.

    Si je mets "AND MEDCHEMIN IS NULL", je n'ai que les NULL comme attendu.
    Si je mets "AND MEDCHEMIN IS NOT NULL", j'ai un résultat identique à mon problème O_o.

    C'est très bizarre.

  4. #4
    Membre averti
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    254
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Avril 2007
    Messages : 254
    Points : 304
    Points
    304
    Par défaut
    Je ne comprend en fait pas pourquoi tu utilises un LEFT JOIN
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    SELECT DISTINCT IMBIENS.BICOD AS BICOD,IMMEDIAS.MEDCHEMIN AS MEDCHEMIN
    FROM IMBIENS, IMMEDIAS 
    WHERE IMBIENS.BIVENTE = 0 
    AND IMBIENS.BIANNULE = 0 
    AND IMBIENS.BICOD IS NOT NULL 
    AND IMBIENS.BITYPOP = 1  
    AND MEDTYPE = 1 
    AND MEDNUM = 1 
    AND IMBIENS.BICOD = IMMEDIAS.BICOD 
    ORDER BY bicod ASC
    Ceci ne fonctionne pas?
    Quand un problème a une solution, rien ne sert de s'inquiéter. Quand il n'y a pas de solution, s'inquiéter n'arrange rien.

  5. #5
    Membre habitué
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    130
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 130
    Points : 127
    Points
    127
    Par défaut
    C'est parceque je veux faire une jointure qui exclue les enregistrements de la table IMMEDIAS qui ne correspondent pas aux critères.

    Une des mes sources d'inspiration pour les jointures => http://sql.developpez.com/sqlaz/jointures/

    La syntaxe que tu donnes correspond à un INNER JOIN, c-a-d que tous les enregistrements des deux tables sont pris.

  6. #6
    Membre averti
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    254
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Avril 2007
    Messages : 254
    Points : 304
    Points
    304
    Par défaut
    Parfois, je suis dur de comprenure
    Ce que tu veux c'est:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    BICOD       |     MEDCHEMIN
    ----------------------------
       1018      |          NULL
       1022      |          1022_1.JPG
       1025      |          1025_1.JPG
       1029      |          1029_1.JPG
       1044      |          1044_1.JPG
    C'est à dire que s'il n'y a aucune correspondance, mettre une ligne avec MEDCHEMIN à null aussi non, ne pas afficher les doublons.
    Quand un problème a une solution, rien ne sert de s'inquiéter. Quand il n'y a pas de solution, s'inquiéter n'arrange rien.

  7. #7
    Membre habitué
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    130
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 130
    Points : 127
    Points
    127
    Par défaut
    Oui c'est tout à fait ça.

    J'ai testé un paquet de choses, et toujours pas réussi.

  8. #8
    Membre averti
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    254
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Avril 2007
    Messages : 254
    Points : 304
    Points
    304
    Par défaut
    Malheureusement, mes cours de SQL sont trop loins. Je ne me souvients plus des joints.
    As-tu essayé (à tout hasard)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    SELECT DISTINCT IMBIENS.BICOD AS BICOD,IMMEDIAS.MEDCHEMIN AS MEDCHEMIN FROM IMBIENS LEFT OUTER JOIN IMMEDIAS ON IMBIENS.BICOD = IMMEDIAS.BICOD 
    WHERE (IMBIENS.BIVENTE = 0 AND IMBIENS.BIANNULE = 0 AND IMBIENS.BICOD IS NOT NULL AND IMBIENS.BITYPOP = 1)  AND MEDTYPE = 1 AND MEDNUM = 1 ORDER BY bicod ASC
    Sinon, désolé, je ne peux pas t'aider plus.
    Quand un problème a une solution, rien ne sert de s'inquiéter. Quand il n'y a pas de solution, s'inquiéter n'arrange rien.

  9. #9
    Membre habitué
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    130
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 130
    Points : 127
    Points
    127
    Par défaut
    Ca ne marche pas non plus.

    Merci pour tes efforts

  10. #10
    Membre confirmé Avatar de chrifo
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    444
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2006
    Messages : 444
    Points : 481
    Points
    481
    Par défaut
    Bonjour,
    avec un max.
    Si je reprends ta requête :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    SELECT IMBIENS.BICOD AS BICOD,max(IMMEDIAS.MEDCHEMIN) AS MEDCHEMIN 
    FROM IMBIENS LEFT JOIN IMMEDIAS ON IMBIENS.BICOD = IMMEDIAS.BICOD 
    WHERE 
    IMBIENS.BIVENTE = 0 
    AND IMBIENS.BIANNULE = 0 
    AND IMBIENS.BICOD IS NOT NULL 
    AND IMBIENS.BITYPOP = 1 
    AND MEDTYPE = 1 
    AND MEDNUM = 1 
    group by IMBIENS.BICOD
    ORDER BY bicod ASC
    Je penche, donc je suis

  11. #11
    Membre habitué
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    130
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 130
    Points : 127
    Points
    127
    Par défaut
    Merci beaucoup, ça marche.

    Tu pourrais me donner une explication pour que je me couche moins con ce soir ?

    Encore merci.

  12. #12
    Membre confirmé Avatar de chrifo
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    444
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2006
    Messages : 444
    Points : 481
    Points
    481
    Par défaut
    Pour ce qui est d'explication générale sur la clause group by, je te laisse faire une recherche sur le site.

    Pour le cas présent :
    La jointure externe ramène au moins une ligne pour chaque IMBIENS.BICOD.
    2 cas :
    - Aucune correspondance n'est trouvée dans l'autre table, le MEDCHEMIN ramené est null --> le max() est null également
    - Au moins une correspondance est trouvée --> le max() est la valeur maxi, et comme null n'a pas de valeur il a perdu
    Je penche, donc je suis

  13. #13
    Membre habitué
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    130
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 130
    Points : 127
    Points
    127
    Par défaut
    Je connais le "group by", c'est sur le "max" que je désirais des précisions.

    Merci beaucoup pour les explications.
    Je n'avais pas pensé à ça, c'est malin.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Doublons dans le résultat d'une requête avec Entity Framework
    Par tobus2012 dans le forum Entity Framework
    Réponses: 9
    Dernier message: 05/07/2014, 00h33
  2. Réponses: 2
    Dernier message: 30/06/2008, 10h20
  3. Réponses: 1
    Dernier message: 14/09/2007, 09h17
  4. Impossible d'exporter le résultat d'une requete avec Runtime
    Par papatte62360 dans le forum Runtime
    Réponses: 4
    Dernier message: 24/11/2006, 12h48
  5. [MySQL] Erreur dans une requête avec jointures
    Par bobic dans le forum Langage SQL
    Réponses: 17
    Dernier message: 03/08/2006, 13h04

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