如何在SQL Server中合并两个表

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何在SQL Server中合并两个表相关的知识,希望对你有一定的参考价值。

我有这两个表:

表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中的姓名属性是姓氏+名字的组合,而TotalDuration是学生参与的持续时间,以分钟为单位。

我想合并这两个表,以便它列出班级中的所有学生及其总持续时间。

[我尝试过OUTER JOINUNION ALL,但无法弄清楚如何列出所有学生,但为那些未在特定日期参加讲座的学生显示NULL值。

我该如何实现?

答案

您可能想通过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

请注意,根据SQL标准,按a.FirstNamea.Surname分组(假定StudentId是主键)是可选的。不过,我不确定SQL Server是否需要它。

另一答案

您可以left joingroup by。但是由于您只需要一个汇总计算,所以相关子查询可能是一种更简单,更有效的方法(如果您有正确的索引,请参见下文):

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

出于性能考虑,请考虑使用table1(studentid, totalduration)上的索引。

旁注:从数据库设计的角度来看,仅不需要Name中的table1列;这是更新信息,使维护任务复杂化(如果有人在另一个表中更改了studend的名字该怎么办?)。您应该删除该列,并仅依靠studentid上的外键。

以上是关于如何在SQL Server中合并两个表的主要内容,如果未能解决你的问题,请参考以下文章

在 SQL Server 2008 中将两个表合并到一个索引视图中

如何在合并数据集之前检查行是不是存在(SQL Server)

sql server 语句如何将3个表合并成一个表?

SQL怎样合并显示两个没有关联的表

SQL Server 2008 将两个表合并为一个但得到重复的行

SQL Server如何将Id相同的字段合并,并且以逗号隔开