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 :

left join et where condition


Sujet :

Langage SQL

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    24
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 24
    Points : 24
    Points
    24
    Par défaut left join et where condition
    Bonjour à tous,

    pouvez vous m'expliquer quelle différence il y a entre les odres sql suivant :

    select .......... ta left join tb
    on
    condition 1 and condition 2

    et

    select ............ta left join tb
    on condition 1
    where condition 2

    Merci de votre aide !

    Cdt.

  2. #2
    Modérateur

    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 799
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    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 799
    Points : 34 031
    Points
    34 031
    Billets dans le blog
    14
    Par défaut
    Comme tu fais une jointure externe, si la condition 2 porte sur la table située après LEFT JOIN, tu transformes la jointures externe en jointure interne car ne seront conservées que les lignes qui satifsont à la condition 2 située dans le WHERE, donc seulement celles qui ont une correspondance avec la première table de la jointure externe.

    Exemple...
    Soit une table de projets associée à une table de personnes, issues du MCD suivant :
    Personne -0,n----Diriger----1,1- Projet

    Personne (prs_id, prs_nom...)
    Projet (prj_id, prj_id_chef_projet, prj_nom, prj_date_debut, prj_date_fin...)

    Jeu de données :
    Personne (prs_id, prs_nom...)
    1, Leménager
    2, Dupont
    3, Durand

    Projet (prj_id, prj_id_chef_projet, prj_nom, prj_date_debut, prj_date_fin...)
    1, 1, Prévert, 2010-01-05, 2010-03-15
    2, 1, Stamas, 2010-07-07, NULL
    3, 2, Dirais +, 2010-02-12, NULL

    Si je cherche toutes les personnes en indiquant quels projets elles ont dirigé, je vais faire la requête suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT prs_nom, prj_nom
    FROM Personne AS prs
    LEFT OUTER JOIN Projet AS prj ON prj.prj_id_chef_projet = prs.prs_id
    Et je peux avoir comme résultat :
    prs_nom / prj_nom
    Leménager / Stamas
    Leménager / Prévert
    Dupont / Dirais +
    Durand / NULL

    => Durand n'a jamais été chef de projet.

    Si maintenant je ne veux que les projets non terminés, si je fais ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT prs_nom, prj_nom
    FROM Personne AS prs
    LEFT OUTER JOIN Projet AS prj ON prj.prj_id_chef_projet = prs.prs_id
    WHERE prj.prj_date_fin IS NULL
    J'aurai tous les projets non terminés mais je perdrai toutes les personnes n'ayant jamais été chef de projet. J'aurai par exemple ceci :
    prs_nom / prj_nom
    Leménager / Stamas
    Dupont / Dirais +

    => Le projet Prévert est terminé et j'ai perdu Dupont en faisant le WHERE.
    => La requête précédente est alors équivalente à celle-ci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT prs_nom, prj_nom
     FROM Personne AS prs
     INNER JOIN Projet AS prj ON prj.prj_id_chef_projet = prs.prs_id
    WHERE prj.prj_date_fin IS NULL
    Pour garder toutes les personnes, même si elles n'ont jamais dirigé de projet, je dois faire cette requête :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT prs_nom, prj_nom
     FROM Personne AS prs
     LEFT OUTER JOIN Projet AS prj ON prj.prj_id_chef_projet = prs.prs_id
       AND prj.prj_date_fin IS NULL
    Ainsi la condition 2 sur la date s'opère sur la table des projets toute seule, avant la jointure. J'aurai ainsi le résultat suivant :
    prs_nom / prj_nom
    Leménager / Stamas
    Dupont / Dirais +
    Durand / NULL

    => On ne sait plus que Leménager a dirigé le projet Prévert !

    Question : En français, que donne en fait comme résultat cette dernière requête ?
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole. Autoentrepreneur.
    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. LEFT JOIN ON plusieurs conditions
    Par comode dans le forum Langage SQL
    Réponses: 4
    Dernier message: 16/09/2011, 14h54
  2. Left join / limit avec condition
    Par AdSFR dans le forum Requêtes
    Réponses: 5
    Dernier message: 03/03/2010, 15h22
  3. LEFT JOIN ou WHERE
    Par jdar dans le forum PL/SQL
    Réponses: 1
    Dernier message: 25/08/2009, 16h40
  4. Left Join et Where
    Par tiamat59 dans le forum Langage SQL
    Réponses: 1
    Dernier message: 27/05/2009, 15h34
  5. Left Join et WHERE
    Par 6ril25 dans le forum Langage SQL
    Réponses: 1
    Dernier message: 05/05/2008, 11h52

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