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

Autres SGBD Discussion :

[PROGRESS] Jointure complexe (utilisation cas, 2 colonnes)


Sujet :

Autres SGBD

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Mars 2010
    Messages
    10
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2010
    Messages : 10
    Points : 11
    Points
    11
    Par défaut [PROGRESS] Jointure complexe (utilisation cas, 2 colonnes)
    Bonjour,

    J'ai une jointure un peu complexe dans ma requete que je n'arrive pas à faire..
    Je souhaite lier deux tables, l'une portant sur des produits et l'autre portant sur le prix de vente.
    Dans la première on trouve notamment le code barre (clé) et le code produit, sachant qu'à un code produit correspond plusieurs codes barre (distinction couleur / taille)
    Dans la deuxième les clés sont le code produit et le code barre, sachant que le champ code barre est parfois vide. Dans le cas où il est vide l'on doit appliquer le prix à tous les produits dont le code barre n'était pas renseigné.

    J'ai essayé ceci:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    SELECT *
    FROM ARTICLE a, PRIX_VENTE p
    WHERE p."Code-barre"=(case when p."Code-barre"<>'' then a."Code-barre" else '' end )
    AND a."Ref-article"= p."Ref-article"
    mais j'obtiens des doublons de produits pour les produits où le code barre était renseigné dans la table prix de vente..

    Please.. help me..

    NB: j'espère avoir été assez claire

  2. #2
    Membre averti Avatar de xdescamp
    Homme Profil pro
    Inscrit en
    Octobre 2008
    Messages
    300
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2008
    Messages : 300
    Points : 442
    Points
    442
    Par défaut
    Bonjour,

    Pour tester la valeur "vide", il faut utiliser l'opérateur IS NULL ou IS NOT NULL.

    Essayez ça, avec un NVL qui remplace la valeur NULL par celle de la table A pour que la jointure fonctionne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT *
    FROM ARTICLE a, PRIX_VENTE p
    WHERE NVL (p."Code-barre", a."Code-barre") = a."Code-barre"
    AND a."Ref-article"= p."Ref-article"

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Mars 2010
    Messages
    10
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2010
    Messages : 10
    Points : 11
    Points
    11
    Par défaut
    Merci pour ta réponse mais ca ne me donne pas le résultat que je souhaiterai..
    Ca me donne les produits avec leurs prix de vente que pour les produits dont le code barre apparait dans la table des prix de vente.
    Hors pour les produits dont le code barre n'est pas dans la table des prix de vente on doit leur associer le prix "générique" celui donné par la ref produit (où le champ code barre est nul dans la table prix de vente mais pas la ref produit).

    J'essaie d'etre claire.. mais pas facile.. :s

  4. #4
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Customer Success Manager @Vertica
    Inscrit en
    Septembre 2008
    Messages
    8 452
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Customer Success Manager @Vertica
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 452
    Points : 17 820
    Points
    17 820
    Par défaut
    Vous pouvez essayer avec une double jointure, celle-ci ne fonctionnera que si pour chaque produit vous avez un et un seul prix par défaut :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    WITH ARTICLE AS
    (
    select 1 as "Ref-article", 'A' as "Code-barre" from dual union all
    select 1                 , 'B'                 from dual union all
    select 2                 , 'C'                 from dual
    )
      ,  PRIX_VENTE AS
    (
    select 1 as "Ref-article", 'A' as "Code-barre", 10 as "Prix" from dual union all
    select 1                 , null               , 20           from dual union all
    select 2                 , null               , 30           from dual
    )
      SELECT art."Ref-article", art."Code-barre", coalesce(pv1."Prix", pv2."Prix") as "Prix"
        FROM ARTICLE art
             INNER JOIN PRIX_VENTE pv2
               ON pv2."Ref-article" = art."Ref-article"
             LEFT OUTER JOIN PRIX_VENTE pv1
               ON pv1."Ref-article" = art."Ref-article"
              AND pv1."Code-barre"  = art."Code-barre"        
       WHERE pv2."Code-barre" IS NULL
    ORDER BY art."Ref-article" asc, art."Code-barre" asc;
     
    Ref-article	Code-barre	Prix
    1		A		10
    1		B		20
    2		C		30

  5. #5
    Membre à l'essai
    Profil pro
    Inscrit en
    Mars 2010
    Messages
    10
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2010
    Messages : 10
    Points : 11
    Points
    11
    Par défaut
    Merci pour ton aide mais le souci est bien que j'ai un prix de vente qui correspond à plusieurs produits.
    En fait j'ai des prix de vente "particulier" qui sont donnés avec la ref produit et le code barre et parfois un prix de vente "générique" qui est donné seulement à la ref produit (le code barre est nul dans la table prix de vente). Ce prix de vente "générique" est valable pour le reste des produits (UN ou PLUSIEURS).


    Exemple avec des produits qui ont la même ref produit:

    Table produits

    Code barre / Ref produit
    50696 / A
    69545 / A
    58737 / A

    Table prix de vente

    Ref produit / Code barre / Prix de vente
    A / 50696 / 50
    A / NULL / 57

    J'aimerai avoir le résultat suivant

    Code barre / Ref produit / Prix de vente
    50696 / A / 50
    69545 / A / 57
    58737 / A / 57

  6. #6
    Membre averti Avatar de xdescamp
    Homme Profil pro
    Inscrit en
    Octobre 2008
    Messages
    300
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2008
    Messages : 300
    Points : 442
    Points
    442
    Par défaut
    Citation Envoyé par lili35 Voir le message
    Merci pour ta réponse mais ca ne me donne pas le résultat que je souhaiterai..
    Ca me donne les produits avec leurs prix de vente que pour les produits dont le code barre apparait dans la table des prix de vente.
    Ca retournait bien le prix quand le code barre n'étais pas renseigné dans la table des prix de vente, mais je me retrouvais avec le même problème de doublon que toi.

    La solution suivante a l'air de mieux fonctionner :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    WITH ARTICLE AS
    (
    SELECT 'A' AS "Ref-article", '50696' AS "Code-barre" FROM dual union ALL
    SELECT 'A'                 , '69545'                 FROM dual union ALL
    SELECT 'A'                 , '58737'                 FROM dual
    )
      ,  PRIX_VENTE AS
    (
    SELECT 'A' AS "Ref-article", '50696' AS "Code-barre", 50 AS "Prix" FROM dual union ALL
    SELECT 'A'                 , NULL               , 57           FROM dual
    )
    SELECT a."Ref-article",
           a."Code-barre",
           Min (p."Prix") Keep (Dense_Rank First Order By p."Code-barre" Nulls Last) "Prix"
    FROM ARTICLE a, PRIX_VENTE p
    WHERE NVL (p."Code-barre", a."Code-barre") = a."Code-barre"
    AND a."Ref-article"= p."Ref-article"
    GROUP BY a."Ref-article",
             a."Code-barre";
     
    R Code-       Prix
    - ----- ----------
    A 50696         50
    A 58737         57
    A 69545         57
    On lui dit de ne garder que la première ligne dans la table des prix de vente, en triant les lignes avec les codes barres vides à la fin. Du coup, s'il trouve une ligne avec le code barre, il la prend, sons il prend celle avec le code barre vide.

  7. #7
    Membre à l'essai
    Profil pro
    Inscrit en
    Mars 2010
    Messages
    10
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2010
    Messages : 10
    Points : 11
    Points
    11
    Par défaut
    Un grand merci pour ta réponse mais en fait je ne suis pas sur oracle mais sur progress du coup j'ai une erreur lors de l'éxécution au niveau de :


  8. #8
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Customer Success Manager @Vertica
    Inscrit en
    Septembre 2008
    Messages
    8 452
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Customer Success Manager @Vertica
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 452
    Points : 17 820
    Points
    17 820
    Par défaut
    Citation Envoyé par lili35 Voir le message
    Merci pour ton aide mais le souci est bien que j'ai un prix de vente qui correspond à plusieurs produits.
    Certes, mais avez-vous au moins essayez la requête que je vous ai proposé ?
    Avec vos données :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    WITH ARTICLE AS
    (
    select 'A' as "Ref-article", '50696' as "Code-barre" from dual union all
    select 'A'                 , '69545'                 from dual union all
    select 'A'                 , '58737'                 from dual
    )
      ,  PRIX_VENTE AS
    (
    select 'A' as "Ref-article", '50696' as "Code-barre", 50 as "Prix" from dual union all
    select 'A'                 , null                   , 57           from dual
    )
      SELECT art."Ref-article", art."Code-barre", coalesce(pv1."Prix", pv2."Prix") as "Prix"
        FROM ARTICLE art
             INNER JOIN PRIX_VENTE pv2
               ON pv2."Ref-article" = art."Ref-article"
             LEFT OUTER JOIN PRIX_VENTE pv1
               ON pv1."Ref-article" = art."Ref-article"
              AND pv1."Code-barre"  = art."Code-barre"        
       WHERE pv2."Code-barre" IS NULL
    ORDER BY art."Ref-article" asc, art."Code-barre" asc;
     
    Ref-article	Code-barre	Prix
    A		50696		50
    A		58737		57
    A		69545		57
    Ça correspond non ?

  9. #9
    Membre à l'essai
    Profil pro
    Inscrit en
    Mars 2010
    Messages
    10
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2010
    Messages : 10
    Points : 11
    Points
    11
    Par défaut
    Oui merci d'avoir insisté..
    En fait j'avais des conditions supplémentaires que je mettais en bas dans le "where":

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    SELECT art."Ref-article", art."Code-barre", coalesce(pv1."Prix", pv2."Prix") AS "Prix"
        FROM ARTICLE art
             INNER JOIN PRIX_VENTE pv2
               ON pv2."Ref-article" = art."Ref-article"
             LEFT OUTER JOIN PRIX_VENTE pv1
               ON pv1."Ref-article" = art."Ref-article"
              AND pv1."Code-barre"  = art."Code-barre"        
       WHERE pv2."Code-barre" IS NULL
       AND AUTRES CONDITIONS
    ORDER BY art."Ref-article" ASC, art."Code-barre" ASC;

    Alors qu'en faite il falait les mettre dans un "select" des tables:


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    SELECT art."Ref-article", art."Code-barre", coalesce(pv1."Prix", pv2."Prix") AS "Prix"
        FROM ARTICLE art
             INNER JOIN (select * from PRIX_VENTE p where conditions) pv2
               ON pv2."Ref-article" = art."Ref-article"
             LEFT OUTER JOIN (select * from PRIX_VENTE p where conditions) pv1
               ON pv1."Ref-article" = art."Ref-article"
              AND pv1."Code-barre"  = art."Code-barre"        
       WHERE pv2."Code-barre" IS NULL
    ORDER BY art."Ref-article" ASC, art."Code-barre" ASC;
    Donc ta réponse était juste mais je l'appliquais mal..
    Un grand merci à toi pour ton aide, ainsi qu'à l'autre personne qui a aussi tenté de m'aider..

  10. #10
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Customer Success Manager @Vertica
    Inscrit en
    Septembre 2008
    Messages
    8 452
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Customer Success Manager @Vertica
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 452
    Points : 17 820
    Points
    17 820
    Par défaut
    Vous pouvez économiser les sous-requêtes :
    • Les autres conditions relatives à pv2 peuvent être placées dans le WHERE.
    • Les autres conditions relatives à pv1 peuvent être placées dans les prédicats de jointures (dans la partie LEFT OUTER JOIN) avant le WHERE.

  11. #11
    Membre à l'essai
    Profil pro
    Inscrit en
    Mars 2010
    Messages
    10
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2010
    Messages : 10
    Points : 11
    Points
    11
    Par défaut
    Ah ok merci je vais voir ca...

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

Discussions similaires

  1. Réponses: 10
    Dernier message: 01/06/2010, 17h55
  2. Réponses: 7
    Dernier message: 01/06/2010, 14h41
  3. [MySQL 4.0.15] Jointure complexe
    Par Carter dans le forum Langage SQL
    Réponses: 4
    Dernier message: 03/02/2006, 14h31
  4. Auto jointure complexe
    Par ricobye dans le forum Langage SQL
    Réponses: 11
    Dernier message: 19/01/2006, 16h02
  5. Jointure avec conditions sur plusieurs colonnes
    Par ben53 dans le forum Langage SQL
    Réponses: 9
    Dernier message: 28/11/2005, 09h27

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