如何从单列表A更新表B的多列数据,解决现有语句仅更新首列的问题
问题原因
- 语法层面:UPDATE语句中写的
UPDATE TABLE B a里TABLE是多余关键字,部分数据库不支持该写法,会直接触发语法报错。 - 逻辑层面:你的更新逻辑默认假设表A中同一个
number_id+country组合只有一行记录,但实际该组合下对应CLAIMED/BOUGHT/RETURNED三个状态分别存在多行。UPDATE关联时,数据库只会取匹配到的任意一行去更新表B的目标行,因此只有该行状态对应的时间字段会被赋值正确,其余字段都会被覆盖为默认值2999-12-31 23:59:5,其他状态行的时间信息完全没有被用到。
正确实现方案
你需要先把表A的数据按关联键分组,将三个状态对应的时间聚合到同一行,再关联更新表B,参考代码如下(兼容Snowflake等支持IFF语法的数据库):
UPDATE B a SET CLAIMED_datetime = COALESCE(SRC.CLAIMED_DT, '2999-12-31 23:59:5'), BOUGHT_datetime = COALESCE(SRC.BOUGHT_DT, '2999-12-31 23:59:5'), RETURNED_datetime = COALESCE(SRC.RETURNED_DT, '2999-12-31 23:59:5') FROM ( SELECT number_id, country, MAX(IFF(STATUS='CLAIMED', DATETIME, NULL)) AS CLAIMED_DT, MAX(IFF(STATUS='BOUGHT', DATETIME, NULL)) AS BOUGHT_DT, MAX(IFF(STATUS='RETURNED', DATETIME, NULL)) AS RETURNED_DT FROM A GROUP BY number_id, country ) SRC WHERE a.number_id = SRC.number_id AND a.country = SRC.country
逻辑说明
- 子查询先按关联键
number_id、country分组,分别提取每个分组下三个状态对应的时间(示例用MAX取同状态下最新时间,你也可以根据业务需求调整为MIN取最早时间),不存在对应状态则返回NULL - 外层更新时用
COALESCE函数判空,NULL值替换为你指定的默认时间即可
内容的提问来源于stack exchange,提问作者user3461502
相关产品推荐
相关产品推荐

