首页 > 解决方案 > 如何从 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”时,上述查询有效。

我怎样才能做到这一点?由于表格的大小,我也需要使用最优化的方法。

标签: sqldb2

解决方案


嗯。. . 我建议使用基于表达式的索引:

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)
            );

推荐阅读