2014-01-13 48 views
5

在外部連接上(讓本例中採用左外連接)如何在右側表格上添加過濾器?在左側外部連接的右側表格上添加過濾器

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' 

我明白,如果過濾器是在Student表會更喜歡「獲取所有行與name =約翰·第一和聯接表」。

但我不確定如果是這種情況,如果過濾器位於右側表格(Student_Instructor)。過濾器i.name='John'如何得到解釋?

謝謝

+0

取決於在JOIN條件或WHERE子句中應用過濾器的位置。 – user2989408

+0

@ user2989408過濾器在JOIN條件下應用,如示例中所示。 – user624558

+0

在您選擇查看查詢計劃之前鍵入EXPLAIN – carexcer

回答

0

無論如何,所有行都將從左表中返回。在左連接的情況下,如果不滿足過濾器,則從右表返回的所有數據都將顯示爲空。就你而言,所有學生都會出現在你的結果中。如果學生沒有教師,i.name將爲空。

由於您只是從左表中選擇一列,所以您的加入非常無用。我還會將i.name添加到您的選擇中,因此您可以看到結果

對於內部聯接,只有在滿足聯接篩選條件時纔會返回行。

+1

謝謝你的解釋。 – user624558

5

應該是相同的:

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

另外,如果需要,可以提供一些示例。 –

1

在你的榜樣查詢,只有在i.name = '約翰' 將返回行。我想你還想包括或i.name爲空以包括學生記錄包含學生教師的所有行。

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

這可以使用Oracle完成(+)符號的良好

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

雖然,Oracle建議您使用FROM子句OUTER JOIN語法,而不是甲骨文加入經營者。

相關問題