2014-01-13 3 views
5

Auf Outer-Joins (in diesem Fall eine linke äußere Verknüpfung) Wie funktioniert das Hinzufügen eines Filters auf der rechten Seite? „Holen Sie alle Zeilen mit namen = John ersten und kommen Sie mit den Tabellen“Hinzufügen von Filtern in der rechten Seitentabelle auf den linken äußeren Joins

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' 

Ich verstehe, dass, wenn die Filter auf dem Student Tisch sind, würde es eher sein.

Aber ich bin mir nicht sicher, ob das der Fall ist, wenn der Filter auf der rechten Seite Tabelle ist (Student_Instructor). Wie wird der Filter i.name='John' interpretiert?

Danke

+0

Hängt davon ab, wo der Filter in der JOIN-Bedingung oder der WHERE-Klausel angewendet wird. – user2989408

+0

@ user2989408 Der Filter wird im JOIN-Zustand angewendet, wie im Beispiel gezeigt. – user624558

+0

Geben Sie EXPLAIN vor Ihrer Auswahl ein, um den Abfrageplan anzuzeigen – carexcer

Antwort

0

Alle Zeilen werden unabhängig von Ihrer linken Tabelle zurückgegeben. Im Falle eines Links Joins, wenn der Filter nicht erfüllt ist, werden alle Daten, die von der rechten Tabelle zurückgegeben werden, als Null angezeigt. In Ihrem Fall werden alle Schüler in Ihren Ergebnissen angezeigt. Wenn der Schüler keinen Lehrer hat, wird i.name null sein.

Da Sie nur eine Spalte aus Ihrer linken Tabelle auswählen, ist Ihre Verknüpfung ziemlich nutzlos. Ich würde auch i.name zu Ihrer Auswahl hinzufügen, damit Sie die Ergebnisse sehen können

Im Falle eines inneren Joins werden Zeilen nur zurückgegeben, wenn der Join-Filter erfüllt ist.

+1

Vielen Dank für die Erklärung. – user624558

5

gleich sein sollte wie:

SELECT s.id FROM Student s 
LEFT OUTER JOIN (Select * from Student_Instructor where name='John') i 
ON s.student_id=i.student_id 
+0

Außerdem können Sie bei Bedarf einige Beispiele bereitstellen. –

1

In Ihrem Beispiel Abfrage nur Zeilen, in denen i.name = 'John' zurückgegeben würde. Ich denke, Sie möchten auch oder i.name ist Null enthalten, um alle Zeilen, in denen ein Student-Datensatz einen Studenten Instructor enthält, aufzunehmen.

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 
0

Dies kann getan werden, Oracle mit (+) Notation als gut

SELECT s.id FROM Student s, Student_Instructor i 
WHERE s.student_id = i.student_id (+) 
AND i.name(+)='John' 

Obwohl Oracle empfiehlt, die FROM-Klausel OUTER JOIN-Syntax verwenden, anstatt die Oracle-Operator verbinden.

Verwandte Themen