sql - 如何在 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 中的 Name 属性是 surname + first name 的组合,TotalDuration 是学生参与的持续时间,以分钟为单位。
我想组合这两个表,以便列出班级中的所有学生及其 TotalDuration。
我试过OUTER JOIN
and UNION ALL
,但不知道如何列出所有学生,但对于那些在特定日期没有参加讲座的学生显示 NULL 值。
我怎样才能做到这一点?
解决方案
你可以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
intable1
是不需要的;这是冗余信息,使维护任务复杂化(如果有人更改另一个表中学生的名字怎么办?)。您应该删除该列,并仅依赖外键studentid
。
推荐阅读
- python - 使用最近邻插值调整 1 通道 numpy(图像)数组的大小
- angular - Angular 12 and IE 11 production build error. TypeError: Object doesn't support this action
- java - Sending bulk sms to the phone number using REST API
- vue.js - Show images files using Vue.js
- google-tag-manager - ec.js 可以用服务器端 gtm 代理吗?
- drupal-8 - Drupal 仅在显示为页面但不在显示块中时提供选项卡菜单
- javascript - 坐标(纬度,语言)的任何地址?
- ruby - 在单例方法上使用 sorbet 接口抽象
- java - Springboot 获取 api 时间太长,同时多次点击
- javascript - 如何在 Android Esspresso Kakao 测试中点击 webview 按钮