sql - 使用临时表连接的 SQL 批量更新
问题描述
我在有效地进行更新时遇到了一些麻烦。
让我列出我的问题。表people
:
卡ID | 创建 | 修改的 |
---|---|---|
1 | 1-1-2001 | 2005 年 1 月 1 日 |
2 | 1-1-2001 | 2005 年 1 月 1 日 |
3 | 1-1-2001 | 2005 年 1 月 1 日 |
4 | 1-1-2001 | 2005 年 1 月 1 日 |
5 | 1-1-2001 | 2005 年 1 月 1 日 |
我有一个像上面这样的表(有更多的列)几百万行。我需要更新大约一百万个修改日期以匹配创建的日期。
现在我想解决这个问题的方法是使用临时表/表变量来收集caIDs
我想要更新的。
DECLARE @temp TABLE(
id BIGINT NOT NULL IDENTITY(1,1) PRIMARY KEY,
caID BIGINT
)
INSERT INTO @temp
(
caID
)
我现在已经使用了类似上面的东西。据我了解,我使用了一个额外的 id 列,我应该能够在批量更新中使用它,以确保我不会一遍又一遍地重复相同的行。
这就是一切都出错的地方。我在这个网站上看到了很多批量更新的例子,但我的问题是我想在 INNER JOIN 中使用 temp/var 表来更新主表。
UPDATE p
SET p.Modified = p.Created
FROM people p
JOIN @temp t ON t.caID = p.caID
我对如何批量更新它感到非常困惑,所以这里的任何提示或提示都将受到欢迎。
我想通过连接进行更新,因为我还有其他行要使用来自各种来源的信息进行更新,这些信息将以相同的方式完成。
如果有人对使用临时表等执行更新有意见,我也欢迎。这对很多东西来说还是相对较新的,我学得越多越好。
如果需要更多信息,请询问。
从其他地方找到了一个看起来不错的解决方案。
WHILE 1 = 1
BEGIN
BEGIN TRANSACTION
UPDATE TOP (1000) ca
UPDATE p
SET p.Modified = p.Created
FROM people p
JOIN @temp t ON t.caID = p.caID
WHERE p.Modified <> p.Created
IF @@ROWCOUNT = 0 -- terminating condition;
BEGIN
COMMIT TRANSACTION
BREAK
END
COMMIT TRANSACTION
WAITFOR DELAY '00:00:00.300';
END
除了在临时表上建立索引外,这似乎工作得很好。
解决方案
推荐阅读
- javascript - 反应:为什么即使没有点击也会执行 onclick?
- linux - linux - sed循环遍历文件中的行列表
- python - 如何从python中的文件导入类?
- shell - 保留包含 2 个 OX 值匹配的 fasta 记录
- python - 如何从 DataFrame 行转换为日期时间格式?
- sql - 将此时间格式转换为秒
- javascript - 不能仅在一个模板中将 js 文件包含在 wordpress 中
- java - 是否可以在 Java 中创建一个 char 数组?
- python - 从循环生成的 python tk.entry 获取输入时出现问题?
- python - Django,如何在一页中添加两个表单?