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 :

Requête OUTER JOIN qui duplique les résultats


Sujet :

Langage SQL

  1. #1
    Candidat au Club
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Novembre 2019
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Distribution

    Informations forums :
    Inscription : Novembre 2019
    Messages : 7
    Points : 2
    Points
    2
    Par défaut Requête OUTER JOIN qui duplique les résultats
    Bonjour
    J'ai l'habitude de faire des requetes sql sur sql serveur (microsoft sql server management studio) , mais j'ai un cas que je n'arrive pas à résoudre:
    pour faire simple
    j'ai une table TShirt avec
    - un champ référence article : REF (par exemple BLANC)
    - un champ gamme :GAM (par exemple des tailles S/M/L/XL/XXL)

    j'ai une table COMMANDE avec
    - REF
    - GAM
    - une quantité d'article QTE

    ma question :
    j'ai une commande article qui contient
    BLANC S x1 piece
    BLANC XL x 2 pieces

    Je voudrais pouvoir afficher la commande en utilisant la table TShirt afin d'avoir ce résultat ci dessous : toutes les gammes existantes pour REF avec la quantité de la commande
    BLANC S x1 piece
    BLANC M x 0
    BLANC L x0
    BLANC XL x 2 pieces
    BLANC XXL x 0


    j'ai fais plusieurs tests et je n'ai que les articles de la table COMMANDE

    Si j'utilise OUTER JOIN entre mes 2 tables j'obtient pour chaque taille de la table Tshirt, l'ensembles des lignes de commandes...voir ci dessous

    BLANC S x1 piece (chaque ligne de commande est affichée pour chaque taille ...)
    BLANC S x2 piece
    BLANC M x1 piece
    BLANC M x2 piece
    BLANC L x1 piece
    BLANC L x2 piece
    BLANC XL x1 piece
    BLANC XL x2 piece
    BLANC XXL x1 piece
    BLANC XXL x2 piece

    Merci par avance pour m'aiguiller sur la façon de créer le select

  2. #2
    Modérateur

    Profil pro
    dba
    Inscrit en
    Janvier 2010
    Messages
    5 643
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : dba

    Informations forums :
    Inscription : Janvier 2010
    Messages : 5 643
    Points : 13 092
    Points
    13 092
    Par défaut
    bonjour

    La jointure externe semble pourtant être la bonne solution, comment avez-vous écrit la requête ? il serait utile de la poster pour qu'on puisse vous dire d'où vient le problème !
    Avez-vous bien mis la condition de jointure sur les deux colonnes REF et GAM ?

  3. #3
    Candidat au Club
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Novembre 2019
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Distribution

    Informations forums :
    Inscription : Novembre 2019
    Messages : 7
    Points : 2
    Points
    2
    Par défaut
    merci de la question: j'ai testé les 2 cas : lié REF et GAM entre les 2 tables / uniquement lié REF entre les 2 tables

    si je mets en relation GAM dans les 2 tables, je n'affiche que les tailles de la commande ! alors que je voudrais toutes les tailles existantes contenues dans TShirt

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    SELECT         dbo.COMMANDE.REF, dbo.TSHIRT.gam, dbo.COMMANDE.QTE, 
     
    FROM            dbo.COMMANDE LEFT OUTER JOIN
                             dbo.TSHIRT ON dbo.COMMANDE.gam= dbo.TSHIRT.gam AND 
                             dbo.COMMANDE.REF = dbo.TSHIRT.REF
    en liant GAM dans les 2 tables, que je fasse left outer join / full outer join /right outer join : je n'ai que les tailles de la commande , ce qui me parait logique car l'idée c'est d'afficher des tailles qui ne sont pas présentes dans la table commande.

  4. #4
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 115
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Retraité
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2002
    Messages : 9 115
    Points : 28 493
    Points
    28 493
    Par défaut
    Est-ce que ce ne serait pas plutôt un RIGHT JOIN qui répondrait à ton besoin ?

  5. #5
    Modérateur

    Profil pro
    dba
    Inscrit en
    Janvier 2010
    Messages
    5 643
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : dba

    Informations forums :
    Inscription : Janvier 2010
    Messages : 5 643
    Points : 13 092
    Points
    13 092
    Par défaut
    oui... et prendre la colonne REF depuis la table Tshirt et non Commande :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    SELECT         TSHIRT.REF, TSHIRT.gam, COALESCE(COMMANDE.QTE, 0)
     
    FROM            COMMANDE RIGHT OUTER JOIN
                             TSHIRT ON COMMANDE.gam= TSHIRT.gam AND 
                             COMMANDE.REF = TSHIRT.REF

  6. #6
    Candidat au Club
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Novembre 2019
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Distribution

    Informations forums :
    Inscription : Novembre 2019
    Messages : 7
    Points : 2
    Points
    2
    Par défaut
    dans manager studio, les 2 tables sont "visibles": je déplace les liens mais je peux aussi écrire la requete.
    Lorsque j'édite la requete et que je force right join : automatiquement ca me remet en right outer join.

    Je me demande si la solution ne serait pas plutôt UNION car toutes les tailles existantes dans commande le sont aussi dans Tshirt mais pas l'inverse. En faisant UNION je devrais obtenir toutes les tailles pour les commandes! ... je vais tester ca !

    edit : je viens d'essayer en utilisant REF de la table TShirt mais ca ne change pas le résultat pour les 2 cas de figure
    Je vais tester union et je confirmerais le résultat !

  7. #7
    Candidat au Club
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Novembre 2019
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Distribution

    Informations forums :
    Inscription : Novembre 2019
    Messages : 7
    Points : 2
    Points
    2
    Par défaut
    bon j'ai résolu mon probleme mais je pense que j'ai utilisé une methode un peu complexe car je n'ai pas réussi à tout écrire dans la même requete !

    En fait, comme j'ai une REF qui se décline en GAM, c'est normal d'avoir des doublons.
    Ce que j'ai fais c'est de concatener REF ET GAM afin d'avoir un nouvel identifiant unique ARTICLE.
    L'idée c'est de faire le outer join sur ARTICLE qui est virtuel
    le nouveau champ dans la table TSHIRT et il faut faire de même dans la table COMMANDE

    REF GAM ARTICLE
    BLANC S BLANCS
    BLANC L BLANCL

    En theorie je devrais faire comme ca
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT         TSHIRT.REF, TSHIRT.gam, COMMANDE.QTE
     
    FROM            COMMANDE RIGHT OUTER JOIN
                             TSHIRT ON COMMANDE.ARTICLE= TSHIRT.ARTICLE
    mais comme ARTICLE est un champ virtuel, je devrais ecrire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT         TSHIRT.REF, TSHIRT.gam, COMMANDE.QTE
     
    FROM            COMMANDE RIGHT OUTER JOIN
                             TSHIRT ON concat( COMMANDE.REF,COMMANDE.gam)=  concat( TSHIRT.REF,TSHIRT.gam)
    Comme ma syntaxe n'allait pas, j'ai donc créer 2 vues TSHIRTGAM et COMMANDEGAM et lorsque je fais le select j'obtient donc mon résultat voulu : avoir toutes les déclinaisons de GAM existante avec la quantité associée dans la commande même si elle est nulle.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT         TSHIRT.REF, TSHIRT.gam, COMMANDE.QTE
     
    FROM            COMMANDEGAM RIGHT OUTER JOIN
                             TSHIRTGAM ON COMMANDEGAM.ARTICLE= TSHIRTGAM.ARTICLE
    S'il y a un tips pour tout faire en une seule requete et gérer le concat dans le OUTER JOIN, je suis preneur
    merci pour les réponses

  8. #8
    Modérateur

    Profil pro
    dba
    Inscrit en
    Janvier 2010
    Messages
    5 643
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : dba

    Informations forums :
    Inscription : Janvier 2010
    Messages : 5 643
    Points : 13 092
    Points
    13 092
    Par défaut
    c'est étrange !

    postez la structure des tables (CREATE TABLE...) et un jeu d'essai (INSERT INTO).

    postez aussi la requête que vous avez ecrite et le résultat attendu/obtenu

  9. #9
    Candidat au Club
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Novembre 2019
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Distribution

    Informations forums :
    Inscription : Novembre 2019
    Messages : 7
    Points : 2
    Points
    2
    Par défaut
    désolé mais je ne souhaite pas modifier les tables car ce sont des tables utilisées par le logiciel sage: non seulement je n'ai pas envie de mettre le bazar mais il y a des chances que les modifications disparaissent lors de mise à jour (ou pire , générèrent des anomalies lors de mise à jour ...)

    edit : en fait j'ai réussi en copiant collant tout le concat.. ca devait être le cpié/collé précédent qui n'avait pas pris toute la syntaxe.
    Probleme réglé

  10. #10
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 385
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : bourreau
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2010
    Messages : 10 385
    Points : 39 883
    Points
    39 883
    Billets dans le blog
    9
    Par défaut
    Citation Envoyé par krisss666 Voir le message
    mais comme ARTICLE est un champ virtuel, je devrais ecrire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT         TSHIRT.REF, TSHIRT.gam, COMMANDE.QTE
     
    FROM            COMMANDE RIGHT OUTER JOIN
                             TSHIRT ON concat( COMMANDE.REF,COMMANDE.gam)=  concat( TSHIRT.REF,TSHIRT.gam)
    merci pour les réponses
    Un champ, virtuel ou pas, ça n'existe pas dans une base de données, peut être voulez vous parler de colonne calculée ?
    Par ailleurs, appliquer des fonctions sur les colonnes de chaque coté de la jointure est une garantie de jointure non sargable, si vos tables sont volumineuses, les performances seront désastreuses
    la jointure doit être codée ainsi :
    ON COMMANDE.REF= TSHIRT.REF AND COMMANDE.gam=TSHIRT.gam.

    Citation Envoyé par krisss666 Voir le message
    désolé mais je ne souhaite pas modifier les tables car ce sont des tables utilisées par le logiciel sage: non seulement je n'ai pas envie de mettre le bazar mais il y a des chances que les modifications disparaissent lors de mise à jour (ou pire , générèrent des anomalies lors de mise à jour ...)
    Communiquer le script (DDL) create table, ce n'est pas modifier les tables...

  11. #11
    Candidat au Club
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Novembre 2019
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Distribution

    Informations forums :
    Inscription : Novembre 2019
    Messages : 7
    Points : 2
    Points
    2
    Par défaut
    merci pour ce complément d'information
    oui en effet je voulais parler de colonne calculée et en effet je pense qu'il vaudrait mieux que je passe par des vues pour eviter une surcharge de calculs avec le concat

    dans mon exemple j'ai volontairement simplifié les termes (voir renommé) pour avoir une réponse sur la logique du select.
    Dans les faits j'ai plusieurs tables qui sont liées pour avoir le résultat et donner le script du create afficherait des noms de champs qui n'ont strictement rien à voir avec ce que j'ai posté.

    Merci pour vos interventions qui font avancer la machine

  12. #12
    Modérateur

    Profil pro
    dba
    Inscrit en
    Janvier 2010
    Messages
    5 643
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : dba

    Informations forums :
    Inscription : Janvier 2010
    Messages : 5 643
    Points : 13 092
    Points
    13 092
    Par défaut
    Citation Envoyé par krisss666 Voir le message
    dans mon exemple j'ai volontairement simplifié les termes (voir renommé) pour avoir une réponse sur la logique du select.
    C'est ce qu'il me semblait aussi.
    le problème en procédant ainsi, c'est qu'on vous donne des réponses correctes du point de vue logique, mais qui ne fonctionnent pas pour vous, car le cas est plus compliqué.

    j'imagine que vous avez plusieurs tables notamment une pour les couleurs, et une autre pour les tailles, et ça change tout en effet. vou spourriez alors imbriquer les jointures, mais sans connaitre votre vrai modèle, difficile d'en dire plus...

    Citation Envoyé par krisss666 Voir le message
    Dans les faits j'ai plusieurs tables qui sont liées pour avoir le résultat et donner le script du create afficherait des noms de champs qui n'ont strictement rien à voir avec ce que j'ai posté.
    Ce n'est pas grave, qui peut le plus peu le moins.

  13. #13
    Candidat au Club
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Novembre 2019
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Distribution

    Informations forums :
    Inscription : Novembre 2019
    Messages : 7
    Points : 2
    Points
    2
    Par défaut
    merci pour vos réactions, j'en tiendrais compte pour un futur probleme ^^

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

Discussions similaires

  1. [AC-2007] Lenteur d'exécution requête outer join
    Par j.lebowski dans le forum Requêtes et SQL.
    Réponses: 9
    Dernier message: 11/07/2010, 12h55
  2. Requete avec LEFT OUTER JOIN et perte de résultats
    Par webtheque dans le forum Langage SQL
    Réponses: 6
    Dernier message: 29/08/2008, 18h57
  3. Un sondage qui affiche les résultats directement
    Par °°° Zen-Spirit °°° dans le forum Balisage (X)HTML et validation W3C
    Réponses: 3
    Dernier message: 04/08/2008, 15h03
  4. requête avec jointure qui renvoie des résultats bizarres
    Par Canari74 dans le forum Requêtes et SQL.
    Réponses: 0
    Dernier message: 20/05/2008, 03h13
  5. table qui duplique les enregistrements
    Par Mihalis dans le forum Bases de données
    Réponses: 7
    Dernier message: 20/03/2007, 16h52

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