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 :

jointure entre 2 tables


Sujet :

Langage SQL

  1. #1
    Membre éclairé
    Inscrit en
    Septembre 2006
    Messages
    365
    Détails du profil
    Informations forums :
    Inscription : Septembre 2006
    Messages : 365
    Par défaut jointure entre 2 tables
    Bonjour,

    j'ai 2 tables VENTES (Article, JOUR, MAGAZIN) et PROMOTIONS (Article, JOUR, MAGAZIN)

    je souhaite chercher les jours de ventes là ou il n'ya pas de promotion, ainsi que les jours de promotions là ou il n'y a pas de ventes

    Normalement, un
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    select v.article, v.jour, v.magazin
    from ventes v 
    join promotions p
    on v.article = p.article, v.jour = p.jour, v.magazin = p.magazin
    ne va renvoyer que les enregistrements communs

    Par contre, un left join ou un right join me renvoie aussi exactement les mêmes enregistrements (communs).. ce qui n'est pas le cas.

    Y a une erreur dans le raisonnement, je ne vois pas laquelle... merci

  2. #2
    Membre émérite
    Profil pro
    Inscrit en
    Août 2008
    Messages
    861
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 861
    Par défaut
    Salut,

    Le right join ne pourra te renvoyer que des lignes vides en plus des enregistrements communs, étant donné que tu fais ta selection sur la première table de ta jointure (v.article, v.jour, v.magasin).

    Par contre, le left join devrait bien te renvoyer tous les enregistrements de la table ventes. D'ailleurs, si tu fais un left join en ne selectionnant que des champs de ta première table, la jointure est inutile.

  3. #3
    Membre éclairé
    Inscrit en
    Septembre 2006
    Messages
    365
    Détails du profil
    Informations forums :
    Inscription : Septembre 2006
    Messages : 365
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    SELECT v.article, v.jour as jour_ventes, p.jour as jour_promo, v.magazin
    FROM ventes v 
    left JOIN promotions p
    ON v.article = p.article, v.jour = p.jour, v.magazin = p.magazin
    me renvoie exactement les mêmes enregistrements..

  4. #4
    Membre émérite
    Profil pro
    Inscrit en
    Août 2008
    Messages
    861
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 861
    Par défaut
    Le left join renvoie les mêmes enregistrements que le inner join?
    Ca veut dire que chaque enregistrement de ta table vente a une correspondance dans ta table promotion. D'un point de vue fonctionnel, ça ne semble pas logique, ça voudrait dire que tu ne vends que des articles en promotion, si j'ai bien compris le principe.

    Que donne le right join?

  5. #5
    Membre Expert Avatar de Yanika_bzh
    Homme Profil pro
    Responsable Applicatif et R&D
    Inscrit en
    Février 2006
    Messages
    1 144
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Responsable Applicatif et R&D
    Secteur : Finance

    Informations forums :
    Inscription : Février 2006
    Messages : 1 144
    Par défaut
    Citation Envoyé par freestyler Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    SELECT v.article, v.jour as jour_ventes, p.jour as jour_promo, v.magazin
    FROM ventes v 
    left JOIN promotions p
    ON v.article = p.article, v.jour = p.jour, v.magazin = p.magazin
    me renvoie exactement les mêmes enregistrements..
    utilisez une jointure EXTERNE : LEFT OUTER JOIN

  6. #6
    Membre émérite
    Profil pro
    Inscrit en
    Août 2008
    Messages
    861
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 861
    Par défaut
    Le OUTER n'est-il pas implicite dans un LEFT JOIN?

    Sur quel environnement travailles tu freestyler?

  7. #7
    Expert éminent
    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 814
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur d'études en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2006
    Messages : 16 814
    Billets dans le blog
    14
    Par défaut
    Comme l'a dit Snipah, si la requête avec LEFT JOIN te renvoie les mêmes lignes qu'avec INNER JOIN (ou JOIN tout court, c'est pareil, le INNER est implicite), c'est que tu as une correspondance de chaque ligne de 'ventes' dans 'promotions'.

    Je ne sais pas comment est conçue ta base de données mais il n'est peut-être pas illogique que tu n'aies que des lignes avec les mêmes jours dans les deux tables :
    Pour un jour donné, un magasin peut faire des promotions et un autre des ventes sans promotion.
    Par contre si tu fais ta jointure sur les 3 colonnes, c'est bizarre qu'un même magasin vende le même produit en promotion et en vente normale le même jour. A moins d'une promo ponctuelle de 14h à 15h ou ce genre de truc...

    Sinon pour répondre à ta demande, si je l'ai bien comprise :
    je souhaite chercher les jours de ventes là ou il n'ya pas de promotion, ainsi que les jours de promotions là ou il n'y a pas de ventes
    Il te faut utiliser un FULL OUTER JOIN qui va te renvoyer toutes les lignes des deux tables avec des NULL dans les colonnes qui n'auront pas de correspondance.
    Autrement dit, si de telles données existent dans tes tables, une ligne de vente avec un jour non présent dans la table 'promotions' donnera un NULL dans la colonne p.jour et inversement une ligne de 'promotions' avec un jour non présent dans la table 'ventes' te donnera un NULL dans la colonne v.jour.
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole, en retraite... mais toujours Autoentrepreneur à l'occasion.
    Mon ancien blog sur la conception des BDD, le langage SQL, le PHP... et mon nouveau blog sur les mêmes sujets.
    « 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 la suite Linux Mageïa !

  8. #8
    Membre Expert Avatar de pacmann
    Homme Profil pro
    Consulté Oracle
    Inscrit en
    Juin 2004
    Messages
    1 626
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Consulté Oracle
    Secteur : Distribution

    Informations forums :
    Inscription : Juin 2004
    Messages : 1 626
    Par défaut
    Salut !

    je souhaite chercher les jours de ventes là ou il n'ya pas de promotion, ainsi que les jours de promotions là ou il n'y a pas de ventes
    Comme dit Cinephil, faire la jointure sur le numéro d'article ne te donnera pas le résultat que tu attends.
    Pourquoi ne pas chercher directement "les jours de ventes là où il n'ya pas de promotion" ?
    J'essaierai bien un truc du genre :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    SELECT distinct v.magasin, v.jour
    FROM ventes v
    WHERE NOT EXISTS
    (SELECT 1 
    FROM promotions p
    WHERE v.article = p.article
    AND v.jour = p.jour
    AND v.magazin = p.magazin
    )

  9. #9
    Membre expérimenté
    Inscrit en
    Juillet 2008
    Messages
    181
    Détails du profil
    Informations personnelles :
    Âge : 46

    Informations forums :
    Inscription : Juillet 2008
    Messages : 181
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    SELECT *
    FROM Vente
    minus
    SELECT *
    FROM Promotion
    Ca devrait te donner pour chaque magasin et chaque article les jours de vente sans promotion.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    SELECT *
    FROM Promotion
    minus
    SELECT *
    FROM Vente
    Les jours de promotion sans vente pour chaque magasin et chaque article.

    Attention "Minus" marche sur Oracle mais pas SQL Server. Je crois que "Except" marche sur SQL Server 2005 mais pas 2000. Tout dépend de ton SGBD

  10. #10
    Expert éminent
    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 814
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur d'études en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2006
    Messages : 16 814
    Billets dans le blog
    14
    Par défaut
    Et MySQL ne connait pas non plus l'opérateur MINUS.
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole, en retraite... mais toujours Autoentrepreneur à l'occasion.
    Mon ancien blog sur la conception des BDD, le langage SQL, le PHP... et mon nouveau blog sur les mêmes sujets.
    « 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 la suite Linux Mageïa !

Discussions similaires

  1. PROBLEME DE JOINTURE ENTRE DEUX TABLE
    Par DarkMax dans le forum Langage SQL
    Réponses: 13
    Dernier message: 13/01/2005, 15h11
  2. Jointure entre 3 tables
    Par zigune dans le forum Langage SQL
    Réponses: 9
    Dernier message: 15/11/2004, 16h04
  3. Jointure entre deux tables et résultat
    Par Asdorve dans le forum Langage SQL
    Réponses: 2
    Dernier message: 02/06/2004, 14h50
  4. [jointure]requete possible de double jointure entre 2 tables
    Par akira_le_gaucher dans le forum Langage SQL
    Réponses: 4
    Dernier message: 11/05/2004, 15h03
  5. Jointure entre 2 tables et OR
    Par PyRoFlo dans le forum Requêtes
    Réponses: 2
    Dernier message: 02/02/2004, 18h42

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