如何从一个 table 中删除 DB2 中另一个 table 中存在的行?

How can I delete from one table where rows exist in another table in DB2?

我想要实现的目标非常简单,但由于某种原因,我无法让它工作——部分原因是我找不到任何特定于 DB2 的帮助。

我想删除 table 中的所有记录,如果它们存在于另一个 table 中(这些都是非常大的 table,有 1m+ 条记录)。这是我尝试过的:

DELETE FROM dave.Last 
WHERE NULBERS IN
    (Select Substr(MSISDN,4) from a1313495.COMBINED_NUMBERS);

dave.Last 是 table 我要有选择地从中删除。我不知道这是否有效,但 运行 很长一段时间,我不得不取消它。

我也试过了

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

这也不起作用,因为它 returns SQL Error: DB2 SQL Error: SQLCODE=-104。令人惊讶的是,当我将“DELETE”更改为“SELECT”时,上述查询有效。

我怎样才能做到这一点?由于 tables.

的大小,我也需要使用最佳方法

嗯。 . .我建议使用 expression-based 索引:

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