sql - 从联接更新列失败
问题描述
我想根据表 2 和表 1 中另一列的比较,用表 1 中的列的数据更新表 2 中的列。
前任。:
我使用了这个脚本:
DECLARE
TYPE dataRows_t IS TABLE OF table1.tagid%TYPE
INDEX BY PLS_INTEGER;
Tag dataRows_t;
tempTag dataRows_t;
BEGIN
SELECT t1.tagid, t1.tagidB
BULK COLLECT INTO Tag, tempTag
FROM table1 t1;
FORALL indx IN 1 .. Tag.COUNT
UPDATE table2 t2
SET t2.tagid = tag(indx)
WHERE t2.tempTagIdB = temptag(indx);
COMMIT;
END;
最多可以运行 40k 行(大约需要 3 分钟才能完成)
10 分钟后,我在 60k 的下一次尝试还没有完成。
我尝试了总共 89k 行 9 小时,但没有完成。
但是,当我取消脚本时,我可以看到值已正确更新,但脚本尚未完成。
我知道检查 89k 行的条件可能不是最有效的,但我没有找到更好的解决方案,我想它会在不到一小时的时间内完成。
我错过了什么?
解决方案
我会尝试合并:
MERGE INTO table2 t2
USING (SELECT tagid, tagidB from table1) t1
ON t2.tagidB = t1.tagidB
WHEN MATCHED THEN UPDATE SET
t2.tagid = t1.tagid
关于您的评论“当我取消脚本时,我可以看到值已正确更新但脚本尚未完成。”。当您运行一个 PL/SQL 代码块时,整个块被发送到 DB 服务器并在那里执行。如果您取消客户端程序中的操作,则不会取消数据库中代码块的执行。您的观察表明它最终完成了执行并提交了更改(因为您的代码块包含提交)。如果您在 PL/SQL 块中没有提交,当它检测到客户端会话消失时,它会在完成后回滚。
推荐阅读
- python - Gmail API 读取所有邮件而不是未读邮件
- mongodb - 如何使用 Mongoose 查找除当前用户之外的所有用户
- c - gcc 编译器忽略调试构建的未初始化变量警告
- c# - C# - 将参数传递给 Thread 时出现问题
- excel - 用于将完成的行移动到另一个工作表的 VBA 代码会导致奇怪的行为
- reactjs - ReactBootstrap 无法使用 React 子项正确呈现选项卡
- python - Python 上的相关性
- android - 如何从 Activity 获取 SharedPreference 值到 BroadcastReceiver?
- python - 如何计算 Pandas 列中的特殊字符?
- excel - 在不引用工作表名称的情况下从不同工作表中查找单元格的总和