对所有数据使用2个表的联接

时间:2017-03-01 21:35:46

标签: sql join

您好我想知道如果我想加入2张桌子,我将使用什么连接。我目前有一个所有学生的名单,所以25名学生到1班,另一张表只显示其中7名他们的考试成绩。

我想要的是以1:1的方式加入测试结果和其他没有我想在下面显示它们所以我总共有20条记录。

如果有人可以请告诉我如何才能实现这一目标。

提前致谢。

2 个答案:

答案 0 :(得分:1)

听起来你想要一个外部加入。

对于这个例子,我们假设有一个名为student的表,它包含一个名为id的列,它是UNIQUE(或PRIMARY)KEY。

我们还假设还有另一个名为test_result的表,其中包含一个名为student_id的列,该列是引用idstudent列的外键}。

出于演示目的,我们只会为这些表格中显示的其他列组成一些名称,namescore

  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 joinfull 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