您好我想知道如果我想加入2张桌子,我将使用什么连接。我目前有一个所有学生的名单,所以25名学生到1班,另一张表只显示其中7名他们的考试成绩。
我想要的是以1:1的方式加入测试结果和其他没有我想在下面显示它们所以我总共有20条记录。
如果有人可以请告诉我如何才能实现这一目标。
提前致谢。
答案 0 :(得分:1)
听起来你想要一个外部加入。
对于这个例子,我们假设有一个名为student
的表,它包含一个名为id
的列,它是UNIQUE(或PRIMARY)KEY。
我们还假设还有另一个名为test_result
的表,其中包含一个名为student_id
的列,该列是引用id
中student
列的外键}。
出于演示目的,我们只会为这些表格中显示的其他列组成一些名称,name
和score
。
SELECT s.id
, s.name
, r.score
FROM student s
LEFT
JOIN test_result r
ON r.student_id = s.id
ORDER
BY r.student_id IS NULL
, s.score DESC
, s.id
请注意,如果student_id
中的test_result
不唯一,则可能会返回与student
中的行匹配的多行。
要获得(最多)每test_result
student
行返回的一行,我们可以使用内联视图。
SELECT s.id
, s.name
, r.score
FROM student s
LEFT
JOIN ( SELECT t.student_id
, MAX(t.score) AS score
FROM test_result t
GROUP BY t.student_id
) r
ON r.student_id = s.id
ORDER
BY r.student_id IS NULL
, s.score DESC
, s.id
ORDER BY子句中的表达式旨在首先返回test_result
中匹配行的学生,然后返回没有匹配行的学生。
这只是一个示范,很可能会排除一些重要的标准,例如应该返回哪个分数。但是如果没有示例模式和一些示例数据,我们只是在猜测。
答案 1 :(得分:0)
您正在寻找left outer join
或full outer join
。
left outer join
会显示所有学生及其考试是否有。
select *
from Students as s
left outer join Tests as t
on s.StudentId = t.StudentId
full outer join
会向所有学生展示他们的考试成绩,并测试即使他们没有学生。
select *
from Students as s
full outer join Tests as t
on s.StudentId = t.StudentId