基于ac_no与part_no匹配更新目标表失败,请求排查SQL语句问题
你的SQL语句问题排查与修正
首先看你的语句,有几个明显的问题导致它一直处于“运行中”状态,我给你拆解下:
核心问题点
- 缺少必要的表关联:你在WHERE条件里用到了
wo.rb_acparts表,但没有在UPDATE的JOIN子句里关联它,这会让数据库执行时做全表笛卡尔积匹配——也就是把rr_sec和rb_acpt的连接结果,再和rb_acparts的所有行逐一比对,数据量稍微大一点就会卡死。 - 表名拼写错误:语句里写了
wo.rr_acparts.part_no,但你提到的目标表应该是wo.rb_acparts吧?多打了个r,这也会导致逻辑错误。 - 冗余的WHERE条件:JOIN子句已经指定了
rr_sec.AC_NO = wo.rb_acpt.ac_no,WHERE里重复写这个条件完全没必要,反而可能干扰数据库的查询优化。
修正后的SQL语句
我帮你调整了语句,把需要的表都正确关联起来,同时用匹配条件ac_no和part_no确保更新的准确性:
UPDATE wo.rr_sec INNER JOIN wo.rb_acpt ON wo.rr_sec.AC_NO = wo.rb_acpt.ac_no INNER JOIN wo.rb_acparts ON wo.rr_sec.PART_NO = wo.rb_acparts.part_no AND wo.rb_acpt.ac_no = wo.rb_acparts.ac_no -- 确保同一张工单的零件匹配 SET wo.rr_sec.p_name = wo.rb_acparts.p_name;
安全建议
在执行UPDATE之前,建议先跑一遍SELECT语句验证匹配结果,确认哪些行会被更新,避免误操作:
SELECT rr_sec.AC_NO, rr_sec.PART_NO, rr_sec.p_name AS 原名称, rb_acparts.p_name AS 目标名称 FROM wo.rr_sec INNER JOIN wo.rb_acpt ON rr_sec.AC_NO = rb_acpt.ac_no INNER JOIN wo.rb_acparts ON rr_sec.PART_NO = rb_acparts.part_no AND rb_acpt.ac_no = rb_acparts.ac_no;
如果这个SELECT能快速返回结果,说明关联逻辑是对的,再执行UPDATE就不会卡了。
内容的提问来源于stack exchange,提问作者Rajneesh..
相关产品推荐
相关产品推荐

