SQL如何根据表1的Grade与Chem字段为表2对应元素列填充Y
实现方案
方式1:关联更新(适用表2已预先创建、需要更新现有数据的场景)
你之前的写法核心问题是搞反了更新目标表,且缺少对应元素列的条件判断逻辑,正确写法如下:
MySQL语法
UPDATE Table2 t2 INNER JOIN Table1 t1 ON t2.Grade = t1.Grade SET t2.AL = CASE WHEN t1.Chem = 'AL' THEN 'Y' ELSE t2.AL END, t2.CR = CASE WHEN t1.Chem = 'CR' THEN 'Y' ELSE t2.CR END, t2.MO = CASE WHEN t1.Chem = 'MO' THEN 'Y' ELSE t2.MO END;
SQL Server语法
UPDATE t2 SET t2.AL = CASE WHEN t1.Chem = 'AL' THEN 'Y' ELSE t2.AL END, t2.CR = CASE WHEN t1.Chem = 'CR' THEN 'Y' ELSE t2.CR END, t2.MO = CASE WHEN t1.Chem = 'MO' THEN 'Y' ELSE t2.MO END FROM Table2 t2 INNER JOIN Table1 t1 ON t2.Grade = t1.Grade
逻辑说明:
- 仅需要关联两张表的
Grade字段即可,不需要额外关联条件 - 每一列的赋值用
CASE做判断:只有当Table1的Chem值匹配当前列对应的元素名时才赋值Y,其余情况保留列原有值,避免误覆盖
方式2:行转列直接生成表2(适用表2还未创建的场景)
如果不需要提前建表,可以直接通过聚合查询直接得到符合要求的结果,一步生成目标表:
-- 通用查询逻辑,执行后直接得到你给出的预期结果 SELECT Grade, MAX(CASE WHEN Chem = 'AL' THEN 'Y' ELSE '' END) AS AL, MAX(CASE WHEN Chem = 'CR' THEN 'Y' ELSE '' END) AS CR, MAX(CASE WHEN Chem = 'MO' THEN 'Y' ELSE '' END) AS MO FROM Table1 GROUP BY Grade
如果需要把结果持久化为表2,可根据数据库调整语法:
- MySQL/Oracle:在查询前加
CREATE TABLE Table2 AS即可 - SQL Server:在
FROM前加INTO Table2即可
内容的提问来源于stack exchange,提问作者AustinT
相关产品推荐
相关产品推荐

