sql - 如何从 DB2 中另一个表中存在行的一个表中删除?
问题描述
我想要实现的目标非常简单,但由于某种原因,我无法让它工作——部分原因是我找不到任何特定于 DB2 的帮助。
如果它们存在于另一个表中,我想从一个表中删除所有记录(这些都是具有 1m+ 条记录的非常大的表)。这是我尝试过的:
DELETE FROM dave.Last
WHERE NULBERS IN
(Select Substr(MSISDN,4) from a1313495.COMBINED_NUMBERS);
dave.Last
是我试图有选择地从中删除的表。我不知道这是否有效,但它运行了很长时间,我不得不取消它。
我也试过
DELETE t1.NUMBERS
FROM dave.Last t1
LEFT JOIN a1313495.COMBINED_NUMBERS t2 ON Substr(t2.MSISDN,4) = t1.NUMBERS
WHERE Substr(t2.MSISDN,4) = t1.NUMBERS
这也不起作用,因为它返回SQL Error: DB2 SQL Error: SQLCODE=-104
。令人惊讶的是,当我将“DELETE”更改为“SELECT”时,上述查询有效。
我怎样才能做到这一点?由于表格的大小,我也需要使用最优化的方法。
解决方案
嗯。. . 我建议使用基于表达式的索引:
create index idx_combined_numbers_msisdn_4
on a1313495.COMBINED_NUMBERS(substr(MSISDN, 4));
然后使用EXISTS
:
DELETE FROM dave.Last l
WHERE EXISTS (SELECT 1
FROM a1313495.COMBINED_NUMBERS cn
WHERE l.NUMBERS = SUBSTR(MSISDN,4)
);
推荐阅读
- apache-spark - Spark-shell 无法启动异常:java.lang.reflect.InvocationTargetException
- android - 当将此作为参数传递给类时,表示需要的上下文为空
- javascript - 提交前更改表单属性
- java - @OneToMany 关系不会将父项的主键保存在子表中
- angular - ngx-quill 无法显示下拉标签
- c# - 如何过滤列表
如果它包含特定的类数据? - javascript - 如何在 java ArrayList 中实现 JavaScript Array shift()
- c# - Postsharp 6.0.28、.NET 4.7.1 和编译时出现的奇怪警告
- powershell - 需要从远程的 PowerShell 脚本执行 winrm set winrm/config/client '@{TrustedHosts="192.168.4.231"}' 命令
- selenium - 自动化 Instagram 的最有效方法是什么?