加入具有多对多关系的表格

时间:2017-04-10 17:46:19

标签: sql left-join inner-join right-join

assuming these 3 tables:
student - | student_id | name       | sex   | - 31 students
score   - | event_id   | student_id | grade | - 173 total grades
event   - | event_id   | type       | date  | - 6 events

this means there could be a total of 186 entries in the grade book,
6 for every student, some or none of which could be NULL.

我试图通过使用这些表来了解联接。我正在尝试加入他们,以便我可以获得所有学生在分配给他们的所有各种测验/测试中的所有成绩。有些学生在某些活动中没有成绩,因此不会出现在标准的内部联合查询中(如预期的那样)。但是,我希望所有学生都能出现,无论是否为NULL,因为所有学生都可以参加。但是,我只能成功获取分数表中记录成绩的学生的数据。我不确定我做错了什么或从哪里开始。

The query I was trying:
SELECT st.student_id, st.name, e.date, e.type, sc.score
FROM event e LEFT JOIN score sc
ON e.event_id = sc.event_id
RIGHT JOIN student st
ON sc.student_id = st.student_id

现在我想我知道为什么它不起作用,只是解决它周围的问题。 LEFT和RIGHT联接的工作原理是,如果指定表中的记录不匹配,则将在需要时附加适当的NULL值。但是,因为所有学生都至少有一个年级,所以从技术上讲,正确的学习是满意的,因为每个学生至少有一个匹配的记录。我可以看到如何修改我在事件和分数之间的联接可以很容易地解决这个问题,但同样,我只是不确定我在做什么。

1 个答案:

答案 0 :(得分:1)

首先,您需要创建所有186个选项的活动/学生。

SELECT *
FROM student
CROSS JOIN event   

然后您使用LEFT JOIN尝试将score分配给每个事件

SELECT *
FROM student
CROSS JOIN event 
LEFT JOIN score
  ON score.student_id = student.student_id 
 AND score.event_id = event.event_id

因为LEFT侧已经有186,所以当score

找不到匹配项时,你会得到那些带有NULL值的组合