You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何创建新List记录时避免使用游标,更新关联ToDo表的新ListId?

批量修复重复关联List的ToDo记录(无游标优化方案)

问题背景

老旧WCF/Angular待办应用存在Bug:用户将ToDo任务复制到不同日期后修改文本,所有副本的文本会同步变更。原因是复制生成的ToDo都指向同一个List记录。目前API逻辑已修复,需处理现有约6600条重复关联的ToDo记录——之前用游标逐行处理耗时9分钟,效率低下,需无循环的批量优化方案。


优化后的批量SQL方案

1. 批量生成新List并记录映射关系

先将待处理的ToDo与对应原List文本存入临时表,再批量插入新List,同时记录新ListId与原ToDoId的映射:

-- 创建临时表存储待处理的ToDo与原List信息
SELECT t.Id AS ToDoId, l.Text AS ListText
INTO #TempToDoList
FROM ToDo t
JOIN List l ON t.ListId = l.Id
-- 仅筛选被多个ToDo共享的List对应的记录
WHERE EXISTS (
    SELECT 1 FROM ToDo t2 
    WHERE t2.ListId = t.ListId AND t2.Id != t.Id
)

-- 批量插入新List,同时将新ListId和ToDoId的映射存入临时表
INSERT INTO List (Text)
OUTPUT inserted.Id, t.ToDoId INTO #NewListMapping (NewListId, ToDoId)
SELECT ListText FROM #TempToDoList

2. 批量更新ToDo的ListId

利用映射表一次性更新所有待处理的ToDo记录:

UPDATE t
SET t.ListId = nm.NewListId
FROM ToDo t
JOIN #NewListMapping nm ON t.Id = nm.ToDoId

3. 清理临时表

DROP TABLE #TempToDoList
DROP TABLE #NewListMapping

方案优势

  • 全程采用集合操作替代逐行循环,6000+数据的处理耗时可压缩至秒级
  • 临时表存储映射关系,逻辑清晰,避免重复计算

SQL优化学习方向与资源

  • 集合思维培养:摒弃面向过程的逐行思路,重点学习JOIN、批量INSERT/UPDATE等集合操作,推荐阅读《SQL必知必会》《高性能MySQL》中关于批量操作的章节
  • 执行计划分析:学会查看数据库执行计划(如SQL Server的执行计划、MySQL的EXPLAIN),快速定位慢查询瓶颈
  • 索引优化:为ToDo表的ListId字段、临时表的关联字段创建合适索引,大幅提升关联查询效率
  • 批量操作最佳实践:掌握INSERT/UPDATE的批量语法,避免单条语句循环执行,学会合理使用临时表、表变量

内容的提问来源于stack exchange,提问作者Asad Koths

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.17 23:51:13