SQL如何基于多表关联匹配结果更新requests表的website_id字段
这个需求完全可以实现,你现有的SQL思路是对的,但存在字段名、表名拼写错误和遗漏筛选条件的问题,直接执行会报错或者更新结果不符合预期。
你写的SQL存在的问题
- 关联字段拼写错误:request_fields表和requests表关联的字段是
requests_id,不是你写的request_id - 字段、表名不匹配:request_fields表存储站点名称的字段是
field_response,不是response;站点表名是websites,对应存储站点名称的字段是website_name,你误写为website.name - 遗漏核心筛选条件:没有加
request_fields.field_id = 1的过滤规则,会匹配到field_id为2的用户名称类记录,导致更新结果错误。
正确的MySQL写法
你用的JOIN UPDATE是MySQL支持的语法,修正后如下:
UPDATE requests INNER JOIN request_fields ON requests.id = request_fields.requests_id AND request_fields.field_id = 1 INNER JOIN websites ON request_fields.field_response = websites.website_name SET requests.website_id = websites.id;
安全执行建议
更新前先执行SELECT语句验证匹配结果是否和预期一致,确认无误后再执行更新操作,避免业务数据错误:
SELECT r.id request_id, rf.field_response 匹配的站点名称, w.id 对应站点ID FROM requests r INNER JOIN request_fields rf ON r.id = rf.requests_id AND rf.field_id = 1 INNER JOIN websites w ON rf.field_response = w.website_name;
如果使用的是PostgreSQL、SQL Server等不支持JOIN UPDATE语法的数据库,可以使用子查询写法,示例(PostgreSQL):
UPDATE requests SET website_id = w.id FROM request_fields rf JOIN websites w ON rf.field_response = w.website_name WHERE requests.id = rf.requests_id AND rf.field_id = 1;
内容的提问来源于stack exchange,提问作者slinkhi
相关产品推荐
相关产品推荐

