You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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';

关键修改点说明

  1. 调整过滤条件位置:把b.Subject = '2'从WHERE移到LEFT JOIN的ON子句里,这样只会匹配Table2中对应科目的记录,未匹配的学生行不会被过滤,能保留所有Group=1的学生。
  2. 修正语法错误:原语句中列之间缺少逗号(比如a.Name a.Age),这是Teradata会报错的语法问题,已经补上。
  3. 科目编码转换:用CASE表达式把科目编码2转换成History,未匹配的学生该字段自动显示NULL,完全符合你的期望。
  4. 去掉多余的DISTINCT:如果Table2中每个学生每个科目只有一条成绩记录,DISTINCT是没必要的;如果存在重复记录,你可以再加上DISTINCT(a.Name, a.Age)来确保行唯一。

执行这个语句后,就能得到你想要的结果:

NameAgeSubjectGrade
Anna12HistoryB
Bengt11HistoryA
Cesar12NULLNULL

内容的提问来源于stack exchange,提问作者Akire

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 08:40:07