如何用同表匹配行的idrecord更新SQL表的svun列?
SQL表更新:根据跨行匹配的idrecord填充svun列
问题描述
我有一个包含5列(Name、idrecord、un、svun、svrecord)的SQL表,表数据如下:
| Name | idrecord | un | svun | svrecord |
|---|---|---|---|---|
| John Doe | JD123 | johndoe | NULL | JM123 |
| Jane Doe | JaD123 | janedoe | NULL | OR123 |
| Olive Err | OR123 | oliverr | NULL | GH123 |
需求:当某行的svrecord与表中另一行的idrecord匹配时,将该行的svun列填充为匹配行的idrecord值。例如第2行的svrecord为OR123,与第3行的idrecord匹配,因此需将第2行的svun更新为OR123。
我尝试了以下SQL语句但未成功,希望得到正确写法:
UPDATE table SET svun = idrecord WHERE (svrecord = idrecord)
解决方案
原语句的问题是仅在同一行内对比svrecord和idrecord,无法实现跨行匹配。需要通过自连接将表与自身关联,找到对应的匹配行来更新。
通用标准SQL写法
适用于大多数支持标准SQL的数据库(如SQL Server、Oracle等):
UPDATE t1 SET svun = t2.idrecord FROM your_table_name t1 JOIN your_table_name t2 ON t1.svrecord = t2.idrecord
MySQL 专属写法
MySQL的UPDATE自连接语法需要调整为:
UPDATE your_table_name t1 JOIN your_table_name t2 ON t1.svrecord = t2.idrecord SET t1.svun = t2.idrecord
PostgreSQL 写法
除了标准写法外,也可以使用子查询实现:
UPDATE your_table_name SET svun = (SELECT idrecord FROM your_table_name t2 WHERE t2.idrecord = your_table_name.svrecord) WHERE EXISTS (SELECT 1 FROM your_table_name t2 WHERE t2.idrecord = your_table_name.svrecord)
注意:请将上述语句中的
your_table_name替换为你实际使用的表名。
内容的提问来源于stack exchange,提问作者Dr.Prog
相关产品推荐
相关产品推荐

