如何基于行值,仅用SQL Update语句批量更新七月数据为八月数据?
问题与解答
提问内容
现有表格结构及数据如下:
| Dimension Key | Name | Month | Value |
|---|---|---|---|
| 1 | A | 7 | 10 |
| 2 | B | 7 | 20 |
| 3 | A | 8 | 15 |
| 4 | B | 8 | 12 |
请问是否可仅使用SQL Update语句将七月数据的Value字段更新为对应Name的八月数据值?例如将Name为B的七月数据Value更新为12。已知:
Dimension Key是主键Name为持久键(durable key)- 允许使用CURSOR但优先考虑非游标方案
解答
完全可以通过单条UPDATE语句实现,利用自连接关联同Name的七月和八月数据即可,无需使用游标。以下是不同数据库环境下的实现方案:
标准SQL/PostgreSQL/MSSQL写法
UPDATE t1 SET t1.Value = t2.Value FROM your_table_name t1 JOIN your_table_name t2 ON t1.Name = t2.Name WHERE t1.Month = 7 AND t2.Month = 8;
MySQL写法
UPDATE your_table_name t1 JOIN your_table_name t2 ON t1.Name = t2.Name SET t1.Value = t2.Value WHERE t1.Month = 7 AND t2.Month = 8;
Oracle写法
UPDATE your_table_name t1 SET t1.Value = ( SELECT t2.Value FROM your_table_name t2 WHERE t2.Name = t1.Name AND t2.Month = 8 ) WHERE t1.Month = 7 AND EXISTS ( SELECT 1 FROM your_table_name t2 WHERE t2.Name = t1.Name AND t2.Month = 8 );
核心逻辑说明
- 通过自连接将七月待更新记录(t1)与对应Name的八月数据源记录(t2)关联
- 利用
WHERE子句精准锁定更新范围和数据来源 - 直接将七月记录的
Value字段替换为八月的对应值
内容的提问来源于stack exchange,提问作者SeanZhang1997
相关产品推荐
相关产品推荐

