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 externe récalcitrante


Sujet :

Langage SQL

  1. #1
    Membre habitué
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    162
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 162
    Points : 193
    Points
    193
    Par défaut Jointure externe récalcitrante
    Bonjour,

    Alors voilà. J'ai une base sql server 2005 qui a 4 tables, service, membre, fonction et personne. Un service a des membres, ou pas. Un membre est lié à une fonction et une personne.
    Je voudrais ramener la liste des services avec le nom du membre qui a la fonction de président. Si un service n'a pas de président, je veux quand même le récupérer.
    J'ai écrit ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    SELECT S.NOM, P.NOM
    FROM SERVICE S
    	LEFT OUTER JOIN MEMBRE M
    		ON M.SER_ID = S.SER_ID
    		JOIN FONCTION F
    			ON M.FON_ID = F.FON_ID
    		JOIN PERSONNE P
    			ON M.PER_ID = P.PER_ID
    WHERE F.LIBELLE = 'PRESIDENT'
    Ça marche sauf que ça ne me ramène pas les services qui n'ont pas de président. J'ai bien tout relu le topo sur les jointures et je ne vois pas ce qui cloche.

    HELP

  2. #2
    Membre expérimenté
    Homme Profil pro
    Ingenieur de recherche - Ecologue
    Inscrit en
    Juin 2003
    Messages
    1 157
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingenieur de recherche - Ecologue

    Informations forums :
    Inscription : Juin 2003
    Messages : 1 157
    Points : 1 414
    Points
    1 414
    Par défaut
    bonjour

    il manque des left
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    SELECT S.Nom,
           P.Nom
      FROM Service S
        JOIN Personne P ON M.Per_id = P.Per_id
        LEFT OUTER JOIN Membre M ON M.Ser_id = S.Ser_id
        LEFT OUTER JOIN Fonction F ON M.Fon_id = F.Fon_id
    WHERE F.Libelle = 'PRESIDENT'
    et comme cela ?

  3. #3
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 106
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France, Val de Marne (Île de France)

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

    Informations forums :
    Inscription : Mai 2002
    Messages : 9 106
    Points : 28 394
    Points
    28 394
    Par défaut
    Lorsqu'un service n'a pas de président, la condition
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    F.LIBELLE = 'PRESIDENT'
    n'est pas vérifiée.

    Pour que ta requête fonctionne, il faut ramener ce filtre au niveau de la jointure.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    SELECT  S.Nom
        ,   P.Nom
    FROM    Service S
        LEFT OUTER JOIN 
            Membre M 
            ON  M.Ser_id = S.Ser_id
        INNER JOIN 
             Personne P 
             ON  M.Per_id = P.Per_id
         INNER JOIN 
            Fonction F 
            ON  M.Fon_id = F.Fon_id
            AND F.Libelle = 'PRESIDENT'

  4. #4
    Membre expérimenté
    Homme Profil pro
    Ingenieur de recherche - Ecologue
    Inscrit en
    Juin 2003
    Messages
    1 157
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingenieur de recherche - Ecologue

    Informations forums :
    Inscription : Juin 2003
    Messages : 1 157
    Points : 1 414
    Points
    1 414
    Par défaut
    pour al1_24

    les 2 requetes ne sont equivalentes ?

  5. #5
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 106
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France, Val de Marne (Île de France)

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

    Informations forums :
    Inscription : Mai 2002
    Messages : 9 106
    Points : 28 394
    Points
    28 394
    Par défaut
    Lorsqu'un service n'a pas de président, la condition F.LIBELLE = 'PRESIDENT' ne peut être vérifiée puisque aucune ligne de Fonction ne peut être mise en concordance.

  6. #6
    Membre expérimenté
    Homme Profil pro
    Ingenieur de recherche - Ecologue
    Inscrit en
    Juin 2003
    Messages
    1 157
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingenieur de recherche - Ecologue

    Informations forums :
    Inscription : Juin 2003
    Messages : 1 157
    Points : 1 414
    Points
    1 414
    Par défaut
    Merci

    et en plus c'est logique (en reflechissant )

  7. #7
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Sr. Specialist Solutions Architect @Databricks
    Inscrit en
    Septembre 2008
    Messages
    8 453
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Sr. Specialist Solutions Architect @Databricks
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 453
    Points : 18 388
    Points
    18 388
    Par défaut
    Aucune des requêtes proposées ne donne le bon résultat.
    Il faut écrire ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    SELECT S.Nom, P.Nom
      FROM dbo.Service as S
           LEFT OUTER JOIN dbo.Membre as M 
           INNER JOIN dbo.Personne as P 
             ON P.Per_id = M.Per_id
           INNER JOIN dbo.Fonction as F 
             ON F.Fon_id = M.Fon_id
            AND F.Libelle = 'PRESIDENT'
             ON M.Ser_id = S.Ser_id

  8. #8
    Membre habitué
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    162
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 162
    Points : 193
    Points
    193
    Par défaut
    Effectivement, seule la syntaxe de Waldar fonctionne. J'ai appris quelque chose sur ce coup.

    Merci à tous pour vos contributions

  9. #9
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 897
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Expert bases de données / SQL / MS SQL Server / Postgresql
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 21 897
    Points : 53 135
    Points
    53 135
    Billets dans le blog
    6
    Par défaut
    Citation Envoyé par Waldar Voir le message
    Aucune des requêtes proposées ne donne le bon résultat.
    Il faut écrire ceci :
    Sauf que c'est mal écrit !!!!

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    SELECT S.Nom, P.Nom
      FROM dbo.Service AS S
           LEFT OUTER JOIN dbo.Membre AS M 
             ON M.Ser_id = S.Ser_id
           INNER JOIN dbo.Personne AS P 
             ON P.Per_id = M.Per_id
           INNER JOIN dbo.Fonction AS F 
             ON F.Fon_id = M.Fon_id
            AND F.Libelle = 'PRESIDENT'
    A +

  10. #10
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Sr. Specialist Solutions Architect @Databricks
    Inscrit en
    Septembre 2008
    Messages
    8 453
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Sr. Specialist Solutions Architect @Databricks
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 453
    Points : 18 388
    Points
    18 388
    Par défaut
    Justement non !
    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
    ;With Service  as (select 1 as Ser_id, 'Service 1' as Nom)
        , Membre   as (select 1 as Ser_id, 1 as Per_id, 1 as Fon_id)
        , Personne as (select 1 as Per_id, 'Personne 1' as Nom)
        , Fonction as (select 2 as Fon_id, 'PRESIDENT' as Libelle)
    SELECT S.Nom, P.Nom, F.Libelle
      FROM Service as S
           LEFT OUTER JOIN Membre as M 
             ON M.Ser_id = S.Ser_id
           INNER JOIN Personne as P 
             ON P.Per_id = M.Per_id
           INNER JOIN Fonction as F 
             ON F.Fon_id = M.Fon_id
            AND F.Libelle = 'PRESIDENT'
     
    Nom       Nom        Libelle
    --------- ---------- ---------
     
    (0 ligne(s) affectée(s))
    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
    ;With Service  as (select 1 as Ser_id, 'Service 1' as Nom)
        , Membre   as (select 1 as Ser_id, 1 as Per_id, 1 as Fon_id)
        , Personne as (select 1 as Per_id, 'Personne 1' as Nom)
        , Fonction as (select 2 as Fon_id, 'PRESIDENT' as Libelle)
    SELECT S.Nom, P.Nom, F.Libelle
      FROM Service as S
           LEFT OUTER JOIN Membre as M 
           INNER JOIN Personne as P 
             ON P.Per_id = M.Per_id
           INNER JOIN Fonction as F 
             ON F.Fon_id = M.Fon_id
            AND F.Libelle = 'PRESIDENT'
             ON M.Ser_id = S.Ser_id
     
    Nom       Nom        Libelle
    --------- ---------- ---------
    Service 1 NULL       NULL
     
    (1 ligne(s) affectée(s))

  11. #11
    Expert confirmé
    Profil pro
    Inscrit en
    Août 2008
    Messages
    2 950
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 2 950
    Points : 5 849
    Points
    5 849
    Par défaut
    Wow je serais passé par une sous requête pour les INNER JOINs, je ne connaissais pas cette écriture

  12. #12
    Modérateur

    Profil pro
    dba
    Inscrit en
    Janvier 2010
    Messages
    5 643
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : dba

    Informations forums :
    Inscription : Janvier 2010
    Messages : 5 643
    Points : 13 092
    Points
    13 092
    Par défaut
    Bonjour

    Personnellement, j'aurais plutôt fait comme ceci :

    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    SELECT S.Nom, P.Nom
    FROM Fonction F
    CROSS JOIN Service S
    LEFT OUTER JOIN Membre M
    	ON M.Fon_id = F.Fon_id
    	AND M.Ser_id = S.Ser_id	
    LEFT OUTER JOIN Personne P
    	ON P.Per_id = M.Per_id
    WHERE F.Libelle = 'PRESIDENT'

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

Discussions similaires

  1. [CR9] faire une Jointure externe
    Par coldec dans le forum SAP Crystal Reports
    Réponses: 5
    Dernier message: 28/06/2005, 12h10
  2. Jointure externe compliquée
    Par miniil dans le forum Langage SQL
    Réponses: 9
    Dernier message: 19/02/2004, 09h27
  3. Jointure externe qui ne fonctionne pas
    Par Guizz dans le forum Langage SQL
    Réponses: 3
    Dernier message: 05/02/2004, 12h26
  4. [ jointure externe ] j'y pompe rien
    Par jaimepasteevy dans le forum Langage SQL
    Réponses: 3
    Dernier message: 16/12/2003, 17h57
  5. [Interbase] [Triggers] jointure externe
    Par AnestheziE dans le forum InterBase
    Réponses: 9
    Dernier message: 17/11/2003, 16h17

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