如何基于双重查询更新表t1中的T2_ID关联字段?
需求可行性及正确SQL写法
这个需求完全可行,你提供的SQL存在语法错误(比如FROM子句写法不符合标准SQL规范)以及逻辑关联不清晰的问题,以下是修正后的正确写法:
通用子查询写法(适配多数关系型数据库)
这种写法逻辑直观,直接通过两个子查询分别获取目标更新值和匹配条件,适用于MySQL、PostgreSQL、SQL Server等主流数据库:
UPDATE t1 SET t2_id = (SELECT id FROM t2 WHERE prop = 'foo') WHERE t2_id = (SELECT id FROM t2 WHERE prop = 'bar');
JOIN优化写法(部分数据库推荐)
如果需要通过JOIN明确关联关系,以MySQL为例:
UPDATE t1 JOIN (SELECT id FROM t2 WHERE prop = 'bar') AS t2_bar ON t1.t2_id = t2_bar.id SET t1.t2_id = (SELECT id FROM t2 WHERE prop = 'foo');
以PostgreSQL为例(支持在UPDATE中使用FROM子句):
UPDATE t1 SET t2_id = (SELECT id FROM t2 WHERE prop = 'foo') FROM (SELECT id FROM t2 WHERE prop = 'bar') AS t2_bar WHERE t1.t2_id = t2_bar.id;
注意事项
- 如果
t2中prop='foo'或prop='bar'对应多条记录(即返回多个id),子查询会因返回多行报错,此时可通过聚合函数指定唯一值,比如(SELECT MAX(id) FROM t2 WHERE prop = 'foo')。 - 执行更新前建议先通过
SELECT语句验证匹配的记录是否符合预期,避免误更新:
SELECT * FROM t1 WHERE t2_id = (SELECT id FROM t2 WHERE prop = 'bar');
内容的提问来源于stack exchange,提问作者stefan.stt
相关产品推荐
相关产品推荐

