JOIN哪一行可能不存在于一个表中

时间:2013-11-20 21:55:59

标签: sql oracle

我有两张桌子:

students
+-------+------+
| id    | name |
+-------+------+
| 1     | Bob  |
+-------+------+
| 2     | Sam  |
+-------+------+

courses
+----+------------+---------+--------+
| id | student_id | teacher | period |
+----+------------+---------+--------+
| 1  |    1       | Mr. X   |    1   | 
+----+------------+---------+--------+
| 2  |    1       | Ms. Y   |    2   |
+----+------------+---------+--------+
| 3  |    2       | Mr. X   |    2   | 
+----+------------+---------+--------+
| 4  |    2       | Ms. Y   |    3   |
+----+------------+---------+--------+

这是我需要从这两个表中得到的结果:

list of students and period 1 teacher
+------------+------+-----------------+
| student_id | name | period 1 teacher|
+------------+------+-----------------+
| 1          |  Bob |       Mr. X     | 
+------------+------+-----------------+
| 2          |  Sam |       null      | 
+------------+------+-----------------+

好的,我需要一个学生名单和他们在一段时间内的老师(在这种情况下,第1期)。但是,他们可能没有在课程表中列出那段时间的老师,在这种情况下,我希望该学生的该栏目为“空”(如上所述“Sam”)。

我最接近的是:

SELECT students.id,students.name,courses.teacher
FROM students
LEFT JOIN courses ON students.id = courses.student_id AND courses.period = '1'

但我只能找回BOTH表中存在的行(在这个例子中,只有'Bob'学生才会被退回,因为'Sam'没有1期教师。

我确信这很简单,但到目前为止,我的谷歌已经失败了。

2 个答案:

答案 0 :(得分:0)

你可以试试这个:

SELECT students.id,students.name,courses.teacher
FROM students
LEFT JOIN (select * from courses WHERE courses.period = '1') courses
ON students.id = courses.student_id

答案 1 :(得分:0)

如果我理解正确并且根据上下文只出现在学生BOB。

假设这是真的,将INFT替换为LENER将起作用。

SELECT students.id,students.name,courses.teacher
FROM students
INNER JOIN courses ON students.id = courses.student_id AND courses.period = '1'

我希望它有用