基于同表另一列主键值更新指定列的SQL实现问题
SQL实现方案
你给出的表结构存在同表列名重复的问题(前、后两个列都命名为id),不符合数据库设计规范,我们先按逻辑给三个列做命名约定,你可以替换为你实际的列名:
- 第一列主键列:
id - 第二列待更新字段:
topic_id - 第三列关联主键列:
related_id(对应你需求中存储关联主键id的第三列)
通用更新语句(适配MySQL、PostgreSQL等多数数据库)
-- 全表更新所有符合关联条件的行 UPDATE 表名 t1 JOIN 表名 t2 ON t1.related_id = t2.id SET t1.topic_id = t2.topic_id WHERE t1.topic_id IS NULL;
如果仅需要更新示例中的id=2的行,可以追加过滤条件:
UPDATE 表名 t1 JOIN 表名 t2 ON t1.related_id = t2.id SET t1.topic_id = t2.topic_id WHERE t1.id = 2;
SQL Server 适配写法
UPDATE t1 SET t1.topic_id = t2.topic_id FROM 表名 t1 JOIN 表名 t2 ON t1.related_id = t2.id WHERE t1.id = 2;
Oracle 适配写法
UPDATE 表名 t1 SET t1.topic_id = (SELECT t2.topic_id FROM 表名 t2 WHERE t2.id = t1.related_id) WHERE t1.id = 2 AND EXISTS (SELECT 1 FROM 表名 t2 WHERE t2.id = t1.related_id);
如果你实际业务中第三列确实和第一列重名为
id,只需要把上述语句中的related_id替换为t1.id,通过表别名即可区分两个重名列。
内容的提问来源于stack exchange,提问作者user16693302
相关产品推荐
相关产品推荐

