2014-01-13 14 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テーブル上にあった場合、それはより多くの「最初の名前=ジョンとのすべての行を取得し、テーブルを結合する」ようになることを理解しています。

しかし、フィルタが右側のテーブル(Student_Instructor)にある場合、そのような場合はわかりません。フィルタi.name='John'はどのように解釈されますか? 、あなたの例のクエリではi.name = 'ジョンは' 返される行のみ

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

フィルタがJOIN条件またはWHERE句に適用される場所によって異なります。 – user2989408

+0

@ user2989408フィルタは、例のようにJOIN条件で適用されます。 – user624558

+0

クエリープランを表示するために選択する前にEXPLAINと入力してください – carexcer

答えて

0

すべての行が左テーブルから返されます。左結合の場合、フィルタが満たされないと、右の表から返されたすべてのデータがNULLとして表示されます。あなたのケースでは、すべての生徒があなたの結果に表示されます。生徒にインストラクターがいない場合、i.nameはnullになります。

あなたは左のテーブルから列を選択するだけなので、あなたの参加はかなり役に立たなくなります。あなたの選択にi.nameを追加すると、結果が表示されます。

内部結合の場合は、結合フィルタが満たされている場合にのみ行が返されます。

+1

ありがとうございます。 – user624558

5

は同じでなければなりません。 を含めるか、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

また、必要に応じていくつかの例を提供できます。 –

0

OracleはあなたがFROM句のOUTER FROM構文ではなく、Oracleがオペレータに参加JOINを使用することをお勧めします、が、これはよく

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

としてOracle(+)表記を使用して行うことができます。

関連する問題