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 24/10/2011, 12h23   #1
Rédacteur/Modérateur
 
Avatar de MaitrePylos
 
Homme Gérard Ernaelsten
DBA & Dev PHP
Inscription : juin 2005
Messages : 3 182
Détails du profil
Informations personnelles :
Nom : Homme Gérard Ernaelsten
Âge : 39
Localisation : Belgique

Informations professionnelles :
Activité : DBA & Dev PHP
Secteur : Service public

Informations forums :
Inscription : juin 2005
Messages : 3 182
Points : 6 470
Points : 6 470
Par défaut [Hôtel SQL Pro] Requête PostgreSQL LEFT OUTER

Bonjour,

Dans les cours de SqlPro , il y a une partie consacré au LEFT OUTER JOIN, avec notamment la requête suivante :

Code SQL :
1
2
3
4
5
6
7
 
SELECT C.CLI_NOM, T.TEL_NUMERO 
FROM   T_CLIENT AS C 
       LEFT OUTER JOIN T_TELEPHONE AS T 
            ON C.CLI_ID = T.CLI_ID 
WHERE  T.TYP_CODE = 'FAX' 
ORDER BY C.CLI_NOM

Or en PostgreSQL pour obtenir le résulta voulu il faut mettre le prédicat dans la condition de jointure comme ceci :

Code SQL :
1
2
3
4
5
6
 
SELECT C.CLI_NOM, T.TEL_NUMERO 
FROM   T_CLIENT AS C 
       LEFT OUTER JOIN T_TELEPHONE AS T 
            ON C.CLI_ID = T.CLI_ID AND  T.TYP_CODE = 'FAX' 
ORDER BY C.CLI_NOM

Existe-t-il une réponse logique à cela, ou ai-je louper un épisode.

Merci de vos lumières.
MaitrePylos est actuellement connecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/10/2011, 13h44   #2
Modérateur
 
Avatar de al1_24
 
Homme Alain
Ingénieur d'études décisionnel
Inscription : mai 2002
Messages : 4 446
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 446
Points : 7 547
Points : 7 547
Aucune explication logique à mon avis, sinon une coquille (pour ne pas dire une erreur)
__________________
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 24/10/2011, 13h48   #3
Modérateur
 
Avatar de CinePhil
 
Homme Philippe Leménager
Ingénieur d'études en informatique
Inscription : août 2006
Messages : 11 029
Détails du profil
Informations personnelles :
Nom : Homme Philippe Leménager
Âge : 48
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 : 11 029
Points : 18 328
Points : 18 328
Envoyer un message via MSN à CinePhil
Effectivement, comme je l'explique dans mon blog, la requête de SQLPro comporte en fait une jointure interne !
__________________
Philippe Leménager. Ingénieur d'étude à l'École Nationale de Formation Agronomique.
Mon blog sur la conception des BDD, le langage SQL, le PHP avec Zend Framework...
« 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 Mandriva Linux ou Mageïa ! Soutenons l'industrie logicielle française !
Linuxiens, comptez-vous !
CinePhil est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 24/10/2011, 14h25   #4
Rédacteur/Modérateur
 
Avatar de MaitrePylos
 
Homme Gérard Ernaelsten
DBA & Dev PHP
Inscription : juin 2005
Messages : 3 182
Détails du profil
Informations personnelles :
Nom : Homme Gérard Ernaelsten
Âge : 39
Localisation : Belgique

Informations professionnelles :
Activité : DBA & Dev PHP
Secteur : Service public

Informations forums :
Inscription : juin 2005
Messages : 3 182
Points : 6 470
Points : 6 470
Citation:
Envoyé par CinePhil Voir le message
Effectivement, comme je l'explique dans mon blog, la requête de SQLPro comporte en fait une jointure interne !
Ta as essayé ton exemple sur quel DB ?, peut-être que certain moteur palie ?
MaitrePylos est actuellement connecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/10/2011, 17h18   #5
Modérateur
 
Homme Fabien
Ingénieur d'études en décisionnel
Inscription : septembre 2008
Messages : 5 686
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 686
Points : 10 431
Points : 10 431
Envoyer un message via ICQ à Waldar Envoyer un message via Skype™ à Waldar
Parmi les SGBD que j'ai pratiqué (Oracle, SQL-Server, Sybase), ça fonctionne ainsi.
La lecture régulière du forum me faire dire que c'est pareil chez PostGreSQL ainsi que MySQL.

C'est tout à fait normal et expliqué dans le blog de Cinephil, peut-être pas assez mis en évidence.

Si je reprends son exemple :
Code :
1
2
3
4
5
6
7
8
9
SELECT A.idA, A.valA, B.idB, B.valB, B.booleen 
  FROM A 
       LEFT OUTER JOIN B
         ON B.idA = A.idA;
 
idA, valA  , idB , valB  , booleen
1  , 'toto', NULL, NULL  , NULL
2  , 'titi', 1   , 'riri', 0
3  , 'tata', 2   , 'fifi', 1
En rajoutant le filtre WHERE B.booleen = 1, on voit bien que seule la troisième ligne répond à ce critère.

En fait, vous demandez à ce qu'un élément de B soit forcément non-nul, la jointure externe n'a plus de sens et le résultat devient le même qu'avec une jointure forte.
__________________
Email : http://scr.im/waldar
Waldar est actuellement connecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/10/2011, 18h14   #6
Membre chevronné
 
Avatar de bernard59139
 
Administrateur de base de données
Inscription : octobre 2006
Messages : 503
Détails du profil
Informations personnelles :
Localisation : France

Informations professionnelles :
Activité : Administrateur de base de données

Informations forums :
Inscription : octobre 2006
Messages : 503
Points : 688
Points : 688
Bonjour

je me permet de completer les réponses.
  • ON décrit les critères de jointures
  • WHERE décrit les filtres

Les 2 requêtes données en exemple par MaitrePylos, ne donneront pas un résultat identique, sauf si la table T_TELEPHONE posséde 1 ligne pour chaque CLI_ID.
bernard59139 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/10/2011, 20h48   #7
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
Citation:
Envoyé par bernard59139 Voir le message
sauf si la table T_TELEPHONE posséde 1 ligne pour chaque CLI_ID.
Rien à voir avec le nombre de ligne de la table T_TELEPHONE, c'est juste qu'un filtre (le WHERE) supprime les lignes où TYP_CODE est NULL. Donc le filtre supprime le but de la jointure externe et la transforme en jointure interne.

A noter que dans l'exemple 13 du chapitre III-C. Les jointures externes, SqlPro écrit bien OR TYP_CODE IS NULL ce qui revient au même que de remonter le filtre dans la clause ON.
Par contre dans l'exemple 14 la coquille est présente.
skuatamad est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/10/2011, 22h54   #8
Expert Confirmé
 
Homme
Inscription : mai 2002
Messages : 1 644
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 29
Localisation : France, Rhône (Rhône Alpes)

Informations forums :
Inscription : mai 2002
Messages : 1 644
Points : 2 641
Points : 2 641
hmm, pour moi les 2 requêtes renvoient la même chose avec ou sans la condition du where.

Dans l'exemple 14 il compare un right outer join et un left outer join, ce qui devrait donner le même résultat vu le cas.
punkoff est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 25/10/2011, 00h17   #9
Modérateur
 
Homme Fabien
Ingénieur d'études en décisionnel
Inscription : septembre 2008
Messages : 5 686
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 686
Points : 10 431
Points : 10 431
Envoyer un message via ICQ à Waldar Envoyer un message via Skype™ à Waldar
Citation:
Envoyé par skuatamad Voir le message
A noter que dans l'exemple 13 du chapitre III-C. Les jointures externes, SqlPro écrit bien OR TYP_CODE IS NULL ce qui revient au même que de remonter le filtre dans la clause ON.
C'est un raccourci que je n'emprunterai pas, si cette colonne est déjà remplie de nulls on n'a pas les mêmes résultats.
__________________
Email : http://scr.im/waldar
Waldar est actuellement connecté   Envoyer un message privé Réponse avec citation 20
Vieux 25/10/2011, 01h07   #10
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
@Punkoff, oui dans l'exemple 14, les 2 requêtes sont identiques mais souffrent chacune de la coquille mentionnée par MaitrePylos.
A savoir qu'en fait ce ne sont que des jointures internes.

@Waldar, effectivement si TYP_CODE n'est pas NOT NULL le résultat n'est pas identique, merci.
skuatamad est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 25/10/2011, 09h13   #11
Expert Confirmé
 
Homme
Inscription : mai 2002
Messages : 1 644
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 29
Localisation : France, Rhône (Rhône Alpes)

Informations forums :
Inscription : mai 2002
Messages : 1 644
Points : 2 641
Points : 2 641
Vu la relation entre client et téléphone, non ca ne changera strictement rien de rajouter un "OR TYP_CODE IS NULL".

Le 1er exemple part sur un right outer join sur la table téléphone qui est en relation :
client 0,n -------- 1,1 téléphone

Enfin avec un autre modèle oui je serai d'accord avec toi !
punkoff est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 25/10/2011, 10h35   #12
Membre éclairé
 
Avatar de boussafi
 
Homme
Ingénieur développement logiciels
Inscription : septembre 2007
Messages : 342
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : Algérie

Informations professionnelles :
Activité : Ingénieur développement logiciels
Secteur : Industrie

Informations forums :
Inscription : septembre 2007
Messages : 342
Points : 397
Points : 397
Envoyer un message via Yahoo à boussafi Envoyer un message via Skype™ à boussafi
bonjour tout le monde;

Attention, quelque SGBD connait une limite à la jointure externe ; car
une jointure externe avec une condition sur la meme jointure n'est permise dans SGBD .

exemple
pour votre information,une requete de genre
Code :
1
2
3
4
SELECT A.idA, A.valA, B.idB, B.valB, B.booleen 
 FROM A 
 LEFT OUTER JOIN B ON B.idA = A.idA 
  AND B.booleen = 1
n'est pas autorisée en MsAccess.
boussafi est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 25/10/2011, 11h00   #13
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
Citation:
Envoyé par punkoff Voir le message
un right outer join sur la table téléphone
Arf, j'avais même pas vu qu'il partait de l'autre côté...
skuatamad est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 25/10/2011, 11h15   #14
Modérateur
 
Avatar de CinePhil
 
Homme Philippe Leménager
Ingénieur d'études en informatique
Inscription : août 2006
Messages : 11 029
Détails du profil
Informations personnelles :
Nom : Homme Philippe Leménager
Âge : 48
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 : 11 029
Points : 18 328
Points : 18 328
Envoyer un message via MSN à CinePhil
Citation:
Envoyé par boussafi Voir le message
bonjour tout le monde;

Attention, quelque SGBD connait une limite à la jointure externe ; car
une jointure externe avec une condition sur la meme jointure n'est permise dans SGBD .

exemple
pour votre information,une requete de genre
Code :
1
2
3
4
SELECT A.idA, A.valA, B.idB, B.valB, B.booleen 
 FROM A 
 LEFT OUTER JOIN B ON B.idA = A.idA 
  AND B.booleen = 1
n'est pas autorisée en MsAccess.
[troll]
MSAccess est-il un SGBD digne de ce nom ?
[/TROLL]

Access à la mauvaise manie d'écrire les joinures en les imbriquant et avec une forêt de parenthèses. Probablement que l'ajout d'une condition de restriction dans la condition de jointure le perturbe.

Que se passe t-il si je dessine une requête en mode graphique avec une jointure à gauche et une condition de restriction dans la table externe ?
(je ne me souviens même plus si on peut "dessiner" une jointure externe avec l'interface graphique des requêtes Access !)
__________________
Philippe Leménager. Ingénieur d'étude à l'École Nationale de Formation Agronomique.
Mon blog sur la conception des BDD, le langage SQL, le PHP avec Zend Framework...
« 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 Mandriva Linux ou Mageïa ! Soutenons l'industrie logicielle française !
Linuxiens, comptez-vous !
CinePhil est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 11h52.


 
 
 
 
Partenaires

Hébergement Web