|
Publicité ' | |||||||||||||||||||||||
|
|
#1 | ||
|
Candidat au titre de Membre du Club
![]() |
Bonjour à tous!
J'ai un modèle permettant de manipuler des écoles et des personnes y travaillant: tbl_ecole (ecole_id, nom) tbl_site (site_id, ecole_id, site_adresse) // parcequ'une école peut avoir différents sites tbl_personne (perso_id, perso_nom, perso_prenom, site_id) tbl_contact(contact_id, perso_id) // table intermédiaire lnk_contact_fonction(conta_id, fonc_co_id) //table de lien entre contact et fonctions Objectif: Je dois faire ressortir pour toutes les écoles, le nom des personnes occupant 2 fonctions précises (directeur et secrétaire, id de fonction 26 et 84) Problème: j'utilise un inner join, donc lorsqu'une école n'a personne pour l'une des 2 fonctions voulues, l'école entière disparaît des résultats au lieu de mettre un simple 'null' dans la fonction concernée. J'ai essayé de jouer avec les left / right / full inner join, mais ça n'a rien donné (le tout en rappellant deux foix par des alias les trio personne/contact/lnk_contact_fonction): Code :
Quelqu'un sait comment je pourrai faire pour avoir toutes les écoles et un simple 'null' dans la colonne 'secrétaire' quand personne n'est indiqué pour cette fonction? Merci à tous! |
||
|
|
00
|
|
|
#2 |
|
Expert Confirmé
![]() Inscription : mai 2002 Messages : 1 638 ![]() |
Bonjour,
Pour afficher vos fonction par école le left outer join est la bonne solution. Concernant la sélection de plusieur fonction, orientez vous vers un "EXISTS" (et un "OR" dans la sous-requete associée sur les 2 fonctions recherchées) afin de ne pas avoir votre problème actuel |
|
|
00
|
|
|
#3 | ||
![]() ![]() |
Il faut faire remonter vos filtres dans vos jointures :
Code :
__________________
Email : http://scr.im/waldar |
||
|
20
|
|
|
#4 |
|
Candidat au titre de Membre du Club
![]() |
Bonjour Waldar,
Super ça marche nickel! Par contre je ne comprends pas pourquoi ça marche.... quelle est la différence entre mettre la restriction sur l'id de fonction dans les jointures plutôt que dans la clause where??? Merci beaucoup en tout cas, au moins ça marche!! |
|
|
00
|
|
|
#5 |
![]() ![]() |
Si tu mets une condition de restriction sur la table de droite dans une jointure gauche (réciproquement sur la table de gauche dans une jointure droite), c'est comme si tu faisais un INNER JOIN.
Voir ce message pour explication détaillée. Comme ce problème revient régulièrement, j'en ai profité pour transformer le message cité en article de mon blog.
__________________
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 ! |
|
00
|
|
|
#6 |
![]() ![]() ![]() Frédéric BROUARDExpert SGBDR & SQL Inscription : mai 2002 Messages : 10 950 ![]() |
ATTENTION : pas obligatoirement dans la jointure. Cela peut aussi être dans le where mais avec un OR .... IS NULL. Tout dépende de votre besoin !
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 * * * * * |
|
00
|
|
|
#7 | ||||
![]() ![]() |
Exact, j'avais oublié cette possibilité.
Que vaut-il mieux alors ? 1) Code :
Code :
Est-ce que ça donne d'ailleurs le même résultat ?
__________________
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 ! |
||||
|
00
|
|
|
#8 | ||||||
![]() ![]() |
Les deux requêtes ne renvoient pas forcément le même résultat, en reprenant les données de votre blog, mais en changeant le booléen de la table B de 0 en null :
Code :
Code :
Code :
__________________
Email : http://scr.im/waldar |
||||||
|
00
|
|
|
#9 |
![]() ![]() |
C'est bien ce qu'il me semblait mais je n'ai pas pris le temps de tester.
__________________
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 ! |
|
00
|
|
|
#10 |
![]() ![]() ![]() Frédéric BROUARDExpert SGBDR & SQL Inscription : mai 2002 Messages : 10 950 ![]() |
Le filtre dans le jointure est évalué avant la mise en jointure. Il renvoie donc toutes les lignes de la tables externe, mais pour la table interne, seulement les lignes valuées avec le critère. La cardinalité est celle de la table externe augmenté du produit cartésien de la table interne s'il y a lieu.
Le filtre dans le where exclue les lignes qui ne répondent pas au critère. Certaines lignes de la table externe seront donc rejetées. 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 * * * * * |
|
00
|
Copyright © 2000-2012 - www.developpez.com