Update Query执行异常:耗时过长且未完成table1的CP字段更新
问题描述
我想用table2的「SC」字段更新table1的「CP」字段,规则如下:
- 当table2中CP与SC不相等时,将table1的CP替换为table2的SC
- 若相等则保持table1的CP不变
两张表通过CP字段关联。但执行下面的Update语句时,运行时间无限长且未完成更新。
表结构
table1结构
| CP |
|---|
| stab |
| crawl |
| dred |
| sab |
table2结构
| CP | SC |
|---|---|
| stab | stab |
| crawl | crawl.com |
| dred | dredal |
| sab | sab |
当前使用的SQL语句
update table1 set table1=try.ss from (select table1.cp, CASE WHEN table1.cp = table2.cp THEN sc ELSE table1.cp END ss from tr.table1 left join table2 on table1.cp = table2.cp ) as try
问题分析与修正
你的SQL存在三个核心问题,这是导致执行超时的原因:
- 更新目标错误:
set table1=try.ss直接写表名是语法错误,应该指定要更新的字段CP - 关联缺失:子查询和外层
table1没有关联条件,数据库会生成笛卡尔积,处理海量无效匹配 - 逻辑判断错误:CASE语句里的判断条件逻辑颠倒,你需要判断的是
table2.CP != table2.SC,而非table1.cp = table2.cp(关联条件本身就保证了这个等式成立)
修正后的SQL(适用于PostgreSQL、SQL Server等支持FROM子句的数据库)
UPDATE table1 SET CP = table2.SC FROM table1 JOIN table2 ON table1.CP = table2.CP WHERE table2.CP != table2.SC;
说明
- 用JOIN替代子查询,逻辑更清晰且执行效率更高
- 仅在
table2.CP != table2.SC时执行更新,符合需求;相等的情况无需处理,自然保留原数值 - 明确关联条件,彻底避免笛卡尔积问题
针对MySQL的适配写法(MySQL不支持UPDATE的FROM子句格式)
UPDATE table1 INNER JOIN table2 ON table1.CP = table2.CP SET table1.CP = table2.SC WHERE table2.CP != table2.SC;
内容的提问来源于stack exchange,提问作者Rohit Jha
相关产品推荐
相关产品推荐

