基于同表关联行的SQL UPDATE实现:同步同URL的download与filename
表数据批量更新SQL方案
核心逻辑
- 先提取表中所有
download = 1的记录,按url维度整理出每个url对应的标准文件名 - 对目标行(同url、且
download = 0的记录)做关联匹配 - 匹配成功的行,统一将
download字段设为1,filename替换为对应url的标准文件名 - 没有任何
download=1记录的url,完全保留原有数据不做修改
可直接执行的SQL
MySQL 环境
基础版本(适合同url下仅存在1条download=1记录的场景):
UPDATE your_table t INNER JOIN ( SELECT url, filename FROM your_table WHERE download = 1 ) src ON t.url = src.url SET t.download = 1, t.filename = src.filename WHERE t.download = 0;
兼容版本(适配同url下可能存在多条download=1记录的场景,避免关联多行报错):
UPDATE your_table t INNER JOIN ( SELECT url, MAX(filename) AS std_filename FROM your_table WHERE download = 1 GROUP BY url ) src ON t.url = src.url SET t.download = 1, t.filename = src.std_filename WHERE t.download = 0;
PostgreSQL / SQL Server 环境
UPDATE your_table t SET download = 1, filename = src.std_filename FROM ( SELECT url, MAX(filename) AS std_filename FROM your_table WHERE download = 1 GROUP BY url ) src WHERE t.url = src.url AND t.download = 0;
执行后校验
可用如下查询核对更新结果:
SELECT url, download, COUNT(*) AS row_cnt, MAX(filename) AS matched_filename FROM your_table GROUP BY url, download;
核对规则:
- 原先存在
download=1记录的url,分组结果中不会出现download=0的行,且所有行的filename值完全统一 - 原本没有
download=1记录的url,会完全保留原有download=0的行及对应filename
内容的提问来源于stack exchange,提问作者goku
相关产品推荐
相关产品推荐

