请求编写SQL更新语句:同步LOADS表site_mgr_id至对应SITES表default_MGR_ID
正确更新LOADS表site_mgr_id字段的SQL语句
需求说明
通过关联关系将LOADS表的site_mgr_id字段更新为对应SITES表的default_MGR_ID值,关联逻辑为:
- LOADS表的
device_id关联DEVICES表的ID - DEVICES表的
site_id关联SITES表的ID
原语句问题
你提供的SQL存在括号未闭合的语法错误,且嵌套子查询的写法在数据量较大时效率偏低。
推荐解决方案
方案1:使用JOIN方式更新(更高效)
这种写法适配MySQL、PostgreSQL等多数数据库,通过多表关联直接完成更新:
UPDATE loads JOIN devices ON loads.device_id = devices.id JOIN sites ON devices.site_id = sites.id SET loads.site_mgr_id = sites.default_MGR_ID;
方案2:修正嵌套子查询写法
如果坚持使用子查询,需要补全缺失的括号,同时统一字段名(原语句中default_site_mgr_id与SITES表的default_MGR_ID不匹配,需修正):
UPDATE loads SET loads.site_mgr_id = ( SELECT s.default_MGR_ID FROM sites s WHERE s.id = ( SELECT d.site_id FROM devices d WHERE d.id = loads.device_id ) );
注意事项
- 确保DEVICES表的
site_id与SITES表的ID存在有效关联,否则子查询可能返回NULL,导致site_mgr_id被更新为NULL - 若LOADS表中存在
device_id未在DEVICES表匹配到的记录,两种方案都会保留原site_mgr_id值(MySQL环境下),具体行为可能因数据库类型略有差异
内容的提问来源于stack exchange,提问作者Dan
相关产品推荐
相关产品推荐

