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 :

Recherche selon un LEFT JOIN


Sujet :

Langage SQL

  1. #1
    Membre confirmé Avatar de wd_newbie
    Homme Profil pro
    Développeur
    Inscrit en
    Mars 2007
    Messages
    728
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

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

    Informations forums :
    Inscription : Mars 2007
    Messages : 728
    Points : 632
    Points
    632
    Par défaut Recherche selon un LEFT JOIN
    Bonjour,

    Je me torture avec cette requête SQL .. sans y trouver de solution ...

    J'ai une table "membres" et une table "Enfant" reliés par le IDMembres

    Je cherche a trouver la liste des Enfants avec le nom du parent sous forme , si Gaston a 3 enfants :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    ID Nom Prenom         Prenom Enfant
    ------------------------------------
     
    1 Lagaffe Gaston     Enfant 1  
    2 Lagaffe Gaston     Enfant 2
    3 Lagaffe Gaston     Enfant 3
    (l'enfant doit être actif , d’où Est _Actif = 1 )

    mais ... également une ligne pour le parent si les enfants ne sont pas actifs ...

    C'est faisable ?



    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
     
    SELECT DISTINCT 
    Membres.IDMembres AS IDMembres,	
    Membres.Nom AS Nom,	
    Membres.Prenom AS Prénom,	
    Enfants.Prenom AS Prénom_En,	
    Enfants.Date_Naissance AS Date_Naissance,	
    Enfants.Est_Actif AS Est_Actif,
    Enfants.Titulaire AS Titulaire
    FROM 
    Membres
    left  JOIN
    Enfants
    ON Membres.IDMembres = Enfants.IDMembres
    WHERE 
    (
    Membres.IDMembres = %2
    OR	Membres.Nom LIKE '%1'
    OR	(Enfants.IDEnfants = '%1' )
    OR	(Enfants.Prenom LIKE '%1')
    )AND (Enfants.Est_Actif = 1 )
    %1 et %2 sont passés lors de la construction de la requête ...

  2. #2
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 311
    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 311
    Points : 39 677
    Points
    39 677
    Billets dans le blog
    9
    Par défaut
    Bonjour,

    Cette question est très récurrente, vous tombez dans le piège de la jointure INNER implicite :
    le fait de mettre une restriction sur une colonne de la table OUTER transforme implicitement la jointure en jointure INNER.
    Il faut déporter cette restriction dans la jointure.

    Egalement, l'identifiant du membre est par définition unique, la clause DISTINCT est donc inutile

    Par ailleurs, l'utilisation d'alias de tables ou de vues est plus pratique que l'utilisation des noms complets

    Enfin, les parenthèses inutiles ne facilitent pas la lecture, autant faire un peu de ménage.

    La requête devient donc :

    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    SELECT MB.IDMembres AS IDMembres
         , MB.Nom       AS Nom	
         , MB.Prenom    AS Prénom
         , EN.Prenom    AS Prénom_En
         , EN.Date_Naissance  AS Date_Naissance	
         , EN.Est_Actif AS Est_Actif
         , EN.Titulaire AS Titulaire
    FROM  Membres       as MB
    left  JOIN Enfants  as EN
      ON EN.IDMembres = MB.IDMembres
     AND EN.Est_Actif = 1 
    WHERE MB.IDMembres = %2
       OR MB.Nom LIKE '%1'

  3. #3
    Membre confirmé Avatar de wd_newbie
    Homme Profil pro
    Développeur
    Inscrit en
    Mars 2007
    Messages
    728
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

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

    Informations forums :
    Inscription : Mars 2007
    Messages : 728
    Points : 632
    Points
    632
    Par défaut
    Effectivement ça marche mieux de cette manière !

    Un grand merci pour ton aide


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

Discussions similaires

  1. [AC-2007] Recherche équivalent Left Join avec jointure =
    Par neupont dans le forum Requêtes et SQL.
    Réponses: 1
    Dernier message: 24/10/2012, 18h58
  2. LEFT JOIN avec Oracle 8i ne va pas... doit utiliser (+)
    Par loikiloik dans le forum Langage SQL
    Réponses: 10
    Dernier message: 21/04/2004, 16h38
  3. Interbase et left join
    Par Zog dans le forum Bases de données
    Réponses: 4
    Dernier message: 23/03/2004, 08h55
  4. Non coincident MySQL (Left Join)
    Par Remiguel dans le forum Requêtes
    Réponses: 6
    Dernier message: 03/11/2003, 21h25
  5. Export d'une vue avec LEFT JOIN
    Par schnourf dans le forum MS SQL Server
    Réponses: 3
    Dernier message: 22/05/2003, 13h57

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