Précédent   Forum des professionnels en informatique > Bases de données > Langage SQL
Langage SQL Forum d'entraide sur le langage SQL et sur les questions liées à la conception de schéma (DDL). Cours SQL
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 06/04/2011, 11h52   #1
Membre habitué
 
Inscription : mai 2007
Messages : 101
Détails du profil
Informations forums :
Inscription : mai 2007
Messages : 101
Points : 100
Points : 100
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 :
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
stanc est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 06/04/2011, 12h55   #2
Membre émérite
 
Homme Olivier Dehorter
Ingenieur de recherche - Ecologue
Inscription : juin 2003
Messages : 697
Détails du profil
Informations personnelles :
Nom : Homme Olivier Dehorter
Localisation : France

Informations professionnelles :
Activité : Ingenieur de recherche - Ecologue

Informations forums :
Inscription : juin 2003
Messages : 697
Points : 837
Points : 837
bonjour

il manque des left
Code :
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 ?
dehorter olivier est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 06/04/2011, 12h56   #3
Modérateur
 
Avatar de al1_24
 
Homme Alain
Ingénieur d'études décisionnel
Inscription : mai 2002
Messages : 4 445
Détails du profil
Informations personnelles :
Nom : Homme Alain
Âge : 51
Localisation : France, Val de Marne (Île de France)

Informations professionnelles :
Activité : Ingénieur d'études décisionnel
Secteur : Conseil

Informations forums :
Inscription : mai 2002
Messages : 4 445
Points : 7 532
Points : 7 532
Lorsqu'un service n'a pas de président, la condition
Code :
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 :
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'
__________________
Modérateur Langage SQL
Règles du forum Langage SQL à lire par tous, N'hésitez pas à consulter les cours SQL
N'oubliez pas le bouton et pensez aux balises [code]
Si une réponse vous a aidé à résoudre votre problème, n'oubliez pas de voter pour elle en cliquant sur
al1_24 est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 06/04/2011, 13h01   #4
Membre émérite
 
Homme Olivier Dehorter
Ingenieur de recherche - Ecologue
Inscription : juin 2003
Messages : 697
Détails du profil
Informations personnelles :
Nom : Homme Olivier Dehorter
Localisation : France

Informations professionnelles :
Activité : Ingenieur de recherche - Ecologue

Informations forums :
Inscription : juin 2003
Messages : 697
Points : 837
Points : 837
pour al1_24

les 2 requetes ne sont equivalentes ?
dehorter olivier est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 06/04/2011, 13h06   #5
Modérateur
 
Avatar de al1_24
 
Homme Alain
Ingénieur d'études décisionnel
Inscription : mai 2002
Messages : 4 445
Détails du profil
Informations personnelles :
Nom : Homme Alain
Âge : 51
Localisation : France, Val de Marne (Île de France)

Informations professionnelles :
Activité : Ingénieur d'études décisionnel
Secteur : Conseil

Informations forums :
Inscription : mai 2002
Messages : 4 445
Points : 7 532
Points : 7 532
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.
__________________
Modérateur Langage SQL
Règles du forum Langage SQL à lire par tous, N'hésitez pas à consulter les cours SQL
N'oubliez pas le bouton et pensez aux balises [code]
Si une réponse vous a aidé à résoudre votre problème, n'oubliez pas de voter pour elle en cliquant sur
al1_24 est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 06/04/2011, 13h10   #6
Membre émérite
 
Homme Olivier Dehorter
Ingenieur de recherche - Ecologue
Inscription : juin 2003
Messages : 697
Détails du profil
Informations personnelles :
Nom : Homme Olivier Dehorter
Localisation : France

Informations professionnelles :
Activité : Ingenieur de recherche - Ecologue

Informations forums :
Inscription : juin 2003
Messages : 697
Points : 837
Points : 837
Merci

et en plus c'est logique (en reflechissant )
dehorter olivier est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 06/04/2011, 15h00   #7
Modérateur
 
Homme Fabien
Ingénieur d'études en décisionnel
Inscription : septembre 2008
Messages : 5 684
Détails du profil
Informations personnelles :
Nom : Homme Fabien
Âge : 34
Localisation : France, Yvelines (Île de France)

Informations professionnelles :
Activité : Ingénieur d'études en décisionnel
Secteur : Arts - Culture

Informations forums :
Inscription : septembre 2008
Messages : 5 684
Points : 10 442
Points : 10 442
Envoyer un message via ICQ à Waldar Envoyer un message via Skype™ à Waldar
Aucune des requêtes proposées ne donne le bon résultat.
Il faut écrire ceci :
Code :
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
__________________
Email : http://scr.im/waldar
Waldar est déconnecté   Envoyer un message privé Réponse avec citation 30
Vieux 07/04/2011, 17h12   #8
Membre habitué
 
Inscription : mai 2007
Messages : 101
Détails du profil
Informations forums :
Inscription : mai 2007
Messages : 101
Points : 100
Points : 100
Effectivement, seule la syntaxe de Waldar fonctionne. J'ai appris quelque chose sur ce coup.

Merci à tous pour vos contributions
stanc est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/04/2011, 17h54   #9
Rédacteur/Modérateur

 
Avatar de SQLpro
 
Homme Frédéric BROUARD
Expert SGBDR & SQL
Inscription : mai 2002
Messages : 10 953
Détails du profil
Informations personnelles :
Nom : Homme Frédéric BROUARD
Localisation : France

Informations professionnelles :
Activité : Expert SGBDR & SQL
Secteur : Conseil

Informations forums :
Inscription : mai 2002
Messages : 10 953
Points : 17 773
Points : 17 773
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 :
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 +
__________________
Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL
Site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/
Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp.
Blog SQL, SQL Server, modélisation données : http://blog.developpez.com/sqlpro
http://www.sqlspot.com : modélisation, conseils, audit, optimisation, formation
* * * * * Enseignant CNAM PACA - ISEN Toulon - CESI Aix en Provence * * * * *
SQLpro est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 07/04/2011, 18h50   #10
Modérateur
 
Homme Fabien
Ingénieur d'études en décisionnel
Inscription : septembre 2008
Messages : 5 684
Détails du profil
Informations personnelles :
Nom : Homme Fabien
Âge : 34
Localisation : France, Yvelines (Île de France)

Informations professionnelles :
Activité : Ingénieur d'études en décisionnel
Secteur : Arts - Culture

Informations forums :
Inscription : septembre 2008
Messages : 5 684
Points : 10 442
Points : 10 442
Envoyer un message via ICQ à Waldar Envoyer un message via Skype™ à Waldar
Justement non !
Code :
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 :
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))
__________________
Email : http://scr.im/waldar
Waldar est déconnecté   Envoyer un message privé Réponse avec citation 20
Vieux 07/04/2011, 21h45   #11
Membre Expert
 
Inscription : août 2008
Messages : 1 271
Détails du profil
Informations forums :
Inscription : août 2008
Messages : 1 271
Points : 1 929
Points : 1 929
Wow je serais passé par une sous requête pour les INNER JOINs, je ne connaissais pas cette écriture
skuatamad est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/04/2011, 16h30   #12
Membre Expert
 
Inscription : janvier 2010
Messages : 1 084
Détails du profil
Informations personnelles :
Localisation : France, Rhône (Rhône Alpes)

Informations forums :
Inscription : janvier 2010
Messages : 1 084
Points : 1 573
Points : 1 573
Bonjour

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

Code SQL :
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'
aieeeuuuuu est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 02h08.


 
 
 
 
Partenaires

Hébergement Web