Sur les jointures externes (prenons une jointure externe gauche dans ce cas) comment fonctionne l'ajout d'un filter sur la table de droite?
SELECT s.id, i.name FROM Student s LEFT OUTER JOIN Student_Instructor i ON s.student_id=i.student_id AND i.name='John'
Je comprends que si le filter se trouvait sur la table des Student
, cela ressemblerait plus à "Obtenir toutes les lignes avec le nom = John en premier et join les tables".
Mais je ne suis pas sûr que ce soit le cas si le filter est sur la table de droite ( Student_Instructor
). Comment le filter i.name='John'
est-il interprété?
Je vous remercie
Toutes les lignes seront returnnées à partir de votre table de gauche. Dans le cas d'une jointure à gauche, si le filter n'est pas satisfait, toutes datatables renvoyées par la table de droite apparaîtront comme nulles. Dans votre cas, tous les étudiants apparaîtront dans vos résultats. Si l'étudiant n'a pas d'instructeur, i.name sera nul.
Puisque vous ne select qu'une colonne de votre table de gauche, votre jointure est plutôt inutile. Je voudrais également append i.name à votre sélection, de sorte que vous pouvez voir les résultats
Dans le cas d'une jointure interne, les lignes ne seront renvoyées que si le filter de jointure est rencontré.
Devrait être le même que:
SELECT s.id FROM Student s LEFT OUTER JOIN (Select * from Student_Instructor where name='John' ) i ON s.student_id=i.student_id
Dans votre exemple de requête, seules les lignes où i.name = 'John' seraient renvoyées. Je pense que vous voudriez également inclure ou i.name est null pour inclure toutes les lignes où un logging d'étudiant inclut un instructeur d'étudiant.
SELECT s.id FROM Student s , isnull(i.name, 'No Student Insturctor') as [Student Instructor] LEFT OUTER JOIN Student_Instructor i ON s.student_id=i.student_id AND i.name='John' or i.name is null
Cela peut être fait en utilisant la notation Oracle (+) ainsi
SELECT s.id FROM Student s, Student_Instructor i WHERE s.student_id = i.student_id (+) AND i.name(+)='John'
Bien qu'Oracle vous recommand d'utiliser la syntaxe OUTER JOIN de la clause FROM plutôt que l'opérateur de jointure Oracle.