如何在SQL中基于parameter_id更新同表不同版本的指定列数据?
基于parameter_id同步不同version的source_of_configuration值的SQL更新语句
我有一张SQL表,结构及数据如下:
| id | parameter_id | source_of_configuration | is_deleted | version |
|---|---|---|---|---|
| 1 | 1 | Standard | 0 | 1 |
| 2 | 2 | tblParamVal | 0 | 1 |
| 3 | 3 | TuningSheet | 0 | 1 |
| 4 | 4 | Standard | 0 | 1 |
| 5 | 5 | tblPTO | 0 | 1 |
| 6 | 1 | Standard | 0 | 2 |
| 7 | 2 | Standard | 0 | 2 |
| 8 | 3 | Standard | 0 | 2 |
| 9 | 4 | Standard | 0 | 2 |
需求:基于parameter_id,将version为2的记录的source_of_configuration列值更新为对应version为1的记录的该列值。
预期结果:
| id | parameter_id | source_of_configuration | is_deleted | version |
|---|---|---|---|---|
| 1 | 1 | Standard | 0 | 1 |
| 2 | 2 | tblParamVal | 0 | 1 |
| 3 | 3 | TuningSheet | 0 | 1 |
| 4 | 4 | Standard | 0 | 1 |
| 5 | 5 | tblPTO | 0 | 1 |
| 6 | 1 | Standard | 0 | 2 |
| 7 | 2 | tblParamVal | 0 | 2 |
| 8 | 3 | TuningSheet | 0 | 2 |
| 9 | 4 | Standard | 0 | 2 |
解决方案
方法1:自连接UPDATE(适用于MySQL、SQL Server)
UPDATE your_table t2 JOIN your_table t1 ON t2.parameter_id = t1.parameter_id SET t2.source_of_configuration = t1.source_of_configuration WHERE t2.version = 2 AND t1.version = 1;
说明:
- 将表自关联,t1映射version=1的记录,t2映射version=2的记录
- 通过
parameter_id匹配同参数的不同版本 - 仅更新t2中符合条件的记录
方法2:子查询UPDATE(适用于PostgreSQL、Oracle)
PostgreSQL版本:
UPDATE your_table t2 SET source_of_configuration = ( SELECT t1.source_of_configuration FROM your_table t1 WHERE t1.parameter_id = t2.parameter_id AND t1.version = 1 ) WHERE t2.version = 2;
Oracle版本:
UPDATE your_table t2 SET source_of_configuration = ( SELECT t1.source_of_configuration FROM your_table t1 WHERE t1.parameter_id = t2.parameter_id AND t1.version = 1 ) WHERE EXISTS ( SELECT 1 FROM your_table t1 WHERE t1.parameter_id = t2.parameter_id AND t1.version = 1 ) AND t2.version = 2;
说明:
- 子查询获取对应parameter_id下version=1的目标值
- Oracle中添加
EXISTS条件,避免因无对应version=1记录导致更新为NULL
验证建议
执行更新前,先运行以下查询确认待更新的数据:
SELECT t2.id, t2.parameter_id, t2.source_of_configuration AS old_value, t1.source_of_configuration AS new_value FROM your_table t2 JOIN your_table t1 ON t2.parameter_id = t1.parameter_id WHERE t2.version = 2 AND t1.version = 1;
注意替换语句中的your_table为实际表名。
内容的提问来源于stack exchange,提问作者Srusti Thakkar
相关产品推荐
相关产品推荐

