如何在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 JOIN
和UNION 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.FirstName
和a.Surname
分组(假定StudentId
是主键)是可选的。不过,我不确定SQL Server是否需要它。
您可以left join
和group 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)