join—如何在sql server中组合两个表

bihw5rsg  于 2021-08-13  发布在  Java
关注(0)|答案(2)|浏览(400)

我有两张table:
表1

Date          Name         StudentID          TotalDuration
------------------------------------------------------------
2019-09-30    aA           11111              100
2019-09-30    bB           22222              40
2019-09-30    cC           33333              60
2019-10-07    aA           11111              50
2019-10-07    bB           22222              10
2019-10-07    cC           33333              12
2019-10-07    dD           44444              90

它包含参加讲座的学生的数据(因此,不包括未参加讲座的学生)。
表2

StudentID          Surname         FirstName          Group
------------------------------------------------------------
11111              A               a                  1
22222              B               b                  1
33333              C               c                  1
44444              D               d                  2
55555              E               e                  2
66666              F               f                  2
77777              G               g                  3

表2包含了班上所有学生的数据。
表1中的name属性是姓+名的组合,totalduration是学生参与的持续时间(分钟)。
我想把这两个表格合并起来,这样它就列出了班上所有的学生和他们的总学时。
我试过了 OUTER JOIN 以及 UNION ALL ,但无法计算如何列出所有学生,但对于在特定日期未参加讲座的学生,显示空值。
我怎样才能做到这一点?

9vw9lbht

9vw9lbht1#

您可能希望通过 StudentID 并使用 LEFT JOIN ,例如:

select
  a.StudentId,
  a.FirstName,
  a.Surname,
  a.Group,
  sum(b.TotalDuration) as total_duration
from table2 a
left join table1 b on b.StudentId = a.StudentId
group by a.StudentId

注意分组方式 a.FirstName 以及 a.Surname (假设 StudentId 是主键)根据sql标准是可选的。不过,我不确定SQLServer是否需要它。

xqnpmsa8

xqnpmsa82#

你可以的 left join 以及 group by . 但是,由于您只需要一个聚合计算,因此相关子查询可能是一种更简单、更有效的方法(如果您有合适的索引,请参见下面的内容):

select 
    t2.*,
    (
        select sum(totalduration) 
        from table1 t1 
        where t1.studentid = t2.studentid
    ) totalduration
from table2 t2

对于性能,请考虑 table1(studentid, totalduration) .
旁注:从数据库设计的Angular 来看,列 Nametable1 只是不需要;这是大量的信息,使维护任务复杂化(如果有人在另一个表中更改studend的名字怎么办?)。您应该删除该列,并依赖于上的外键 studentid 只是。

相关问题