Teradata SQL查询求助:保留未选特定科目学生并转换科目编码
修正Teradata SQL查询以包含未选修科目的学生
我来帮你搞定这个SQL问题,先拆解下核心问题,再给出修正后的语句:
原查询的问题
你最初的查询把b.subject in ('2')放在了WHERE子句里,这会直接把左连接变成内连接——因为左连接后,未选修该科目的学生对应的b.subject是NULL,而WHERE里的条件会把这些NULL的行过滤掉,所以只返回了有成绩的学生。
修正后的SQL语句
SELECT a.Name, a.Age, CASE WHEN b.Subject = '2' THEN 'History' ELSE NULL END AS Subject, b.Grade FROM Table1 a LEFT JOIN Table2 b ON a.Name = b.Name AND b.Subject = '2' -- 把科目过滤条件移到JOIN的ON子句中 WHERE a.Group = '1';
关键修改点说明
- 调整过滤条件位置:把
b.Subject = '2'从WHERE移到LEFT JOIN的ON子句里,这样只会匹配Table2中对应科目的记录,未匹配的学生行不会被过滤,能保留所有Group=1的学生。 - 修正语法错误:原语句中列之间缺少逗号(比如
a.Name a.Age),这是Teradata会报错的语法问题,已经补上。 - 科目编码转换:用
CASE表达式把科目编码2转换成History,未匹配的学生该字段自动显示NULL,完全符合你的期望。 - 去掉多余的DISTINCT:如果Table2中每个学生每个科目只有一条成绩记录,
DISTINCT是没必要的;如果存在重复记录,你可以再加上DISTINCT(a.Name, a.Age)来确保行唯一。
执行这个语句后,就能得到你想要的结果:
| Name | Age | Subject | Grade |
|---|---|---|---|
| Anna | 12 | History | B |
| Bengt | 11 | History | A |
| Cesar | 12 | NULL | NULL |
内容的提问来源于stack exchange,提问作者Akire
相关产品推荐
相关产品推荐

