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 :

Utilisation d'un filtre directement sur 'LEFT OUTER JOIN'


Sujet :

Langage SQL

  1. #1
    Membre extrêmement actif Avatar de lodan
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    2 064
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 2 064
    Points : 682
    Points
    682
    Par défaut Utilisation d'un filtre directement sur 'LEFT OUTER JOIN'
    Bonjour,

    Petit casse tête qui ne me laisse pas en paix :

    J'ai la requête suivante (j'ai mis * pour l'exemple pour ne pas encombrer avec la liste des champs):

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    SELECT *
    FROM t_users_dossiers
    LEFT OUTER JOIN maj_adresses ON t_users_dossiers.id_maj = maj_adresses.id_maj 
    AND (
    CURDATE( )
    BETWEEN adr_date_debut
    AND adr_date_fin
    OR CURDATE( ) >= adr_date_debut
    AND adr_date_fin IS NULL
    )
    WHERE id_user='6'
    Je trouve 119 enregistrements, mais les informations de la table maj_adresses sont toutes NULL

    Si je fais cette requête ci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    SELECT *
    FROM maj_adresses
    LEFT OUTER JOIN t_users_dossiers ON t_users_dossiers.id_maj = maj_adresses.id_maj
    AND (
    CURDATE( )
    BETWEEN adr_date_debut
    AND adr_date_fin
    OR CURDATE( ) >= adr_date_debut
    AND adr_date_fin IS NULL
    )
    WHERE id_user = '6'
    J'ai le même nombre d'enregistrements mais avec les informations complète de la table maj_adresses.

    Du coup j'ai refais la 1ère requête pour tester et cette fois-ci sans le filtre sur la date. J'ai eu toute mes informations.

    J'ai donc un doute sur l'utilisation de mon filtre directement sur le 'LEFT OUTER JOIN'

    Merci d'avance

  2. #2
    Expert éminent
    Homme Profil pro
    Big Data / Freelance EURL
    Inscrit en
    Mars 2003
    Messages
    2 124
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Big Data / Freelance EURL

    Informations forums :
    Inscription : Mars 2003
    Messages : 2 124
    Points : 7 291
    Points
    7 291
    Par défaut
    Dans le premier cas les informations n'ont l'air de ne jamais satisfaire aux conditions sur maj_adresses. Or ces conditions sont du côté "externe" de la requête et la table maître est la table des utilisateurs. Donc les informations ne seront jamais ramenées.

    Dans le deuxième cas les conditions sur informations ne sont pas plus satisfaites. Mais comme la table maître est celle des dossiers où sont les informations, que la jointure ramène des données ou pas, on a déjà les informations dans la table maître quelque soient les résultats de la jointure.

    C'est là l'interêt de mettre des filtres dans une clause LEFT JOIN plutôt que dans un WHERE comme on le faisait dans des jointures (+) d'Oracle ou *= de SQL Server.

    sinon pour bien comprendre la différence entre les filtres sur une jointure ou dans la clause WHERE:
    sql pro, SQL de A à Z : partie 2.4.3. Discussion sur la jointure externe

    En tout cas la question de ce post est un bon exemple d'utilisation de filtre dans le LEFT JOIN

  3. #3
    Membre extrêmement actif Avatar de lodan
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    2 064
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 2 064
    Points : 682
    Points
    682
    Par défaut
    Merci, pour cet éclaircissement.

    J'ai lu et relu la bible A à Z et je suis satisfait de ta confirmation sur un doute que j'ai appliqué sur plusieurs de mes requêtes.

    J'ai un peu trop utilisé LEFT OUTER JOIN, là ou du JOIN était la solution.

    Merci encore.

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

Discussions similaires

  1. Aide sur une requête LINQ avec left outer join
    Par jbrasselet dans le forum Linq
    Réponses: 5
    Dernier message: 12/09/2011, 09h31
  2. Left outer join sur table temporaire
    Par shafomat dans le forum SQL
    Réponses: 3
    Dernier message: 02/09/2011, 11h58
  3. Conditions sur la table de droite d'un LEFT OUTER JOIN
    Par pepper18 dans le forum Langage SQL
    Réponses: 7
    Dernier message: 15/03/2011, 17h32
  4. LEFT OUTER JOIN refusé sur une colonne de formule
    Par madina dans le forum Reports
    Réponses: 20
    Dernier message: 20/07/2010, 13h46
  5. Left outer join sur Select multitable
    Par ChrOnOs83 dans le forum Requêtes
    Réponses: 1
    Dernier message: 21/01/2009, 17h16

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