基于关联主表code更新Table2中plant列的SQL语句求助
问题:关联主表更新子表字段值
现有两张表,Table1(主表)包含code字段及对应的plant字段;Table2包含业务数据,其code字段与Table1的code字段一致,需以code为关联依据,将Table2的plant字段更新为Table1中对应的值。尝试了以下UPDATE语句但无法正常运行,请求修正:
UPDATE TABLE_B B SET B.PLANT = CASE WHEN (B.CODE IN (SELECT CODE FROM TABLE_A A)) THEN A.PLANT ELSE NULL END;
表结构及数据
Table1(主表)
| code | plant |
|---|---|
| A001 | 30009 |
| B001 | 30018 |
| C001 | 30006 |
Table2
| DATE | CODE | PLANT |
|---|---|---|
| 2024-09-03 | A001 | |
| 2024-09-03 | B001 | |
| 2024-09-03 | C001 | |
| 2024-09-04 | A001 | |
| 2024-09-04 | C001 | |
| 2024-09-05 | A001 | |
| 2024-09-06 | B001 | |
| 2024-09-06 | A001 | |
| 2024-09-06 | C001 |
原语句问题分析
原SQL的核心问题是:CASE语句中引用的A.PLANT无法关联到外层的Table2记录——子查询SELECT CODE FROM TABLE_A A仅判断code是否存在,但未建立B.CODE与A.CODE的一对一匹配,导致数据库无法确定要取哪条Table1的plant值。
修正后的SQL语句
根据不同数据库类型,提供对应的正确写法:
MySQL/MariaDB
UPDATE Table2 B JOIN Table1 A ON B.code = A.code SET B.plant = A.plant;
Oracle
仅更新存在匹配的记录:
UPDATE Table2 B SET B.plant = (SELECT A.plant FROM Table1 A WHERE A.code = B.code) WHERE EXISTS (SELECT 1 FROM Table1 A WHERE A.code = B.code);
若需将无匹配的plant设为NULL(与原需求的ELSE NULL逻辑一致),去掉WHERE条件即可:
UPDATE Table2 B SET B.plant = (SELECT A.plant FROM Table1 A WHERE A.code = B.code);
SQL Server
UPDATE B SET B.plant = A.plant FROM Table2 B INNER JOIN Table1 A ON B.code = A.code;
内容的提问来源于stack exchange,提问作者Ambika ..
相关产品推荐
相关产品推荐

