从一个表中删除记录并连接到另一个表SQL

问题描述 投票:1回答:2

我有两个表,一个表具有212,000条记录(不推荐使用的记录),另一个表具有10,500,000条记录

我想在id和version_number字段上加入两个表,因为两个表都有这些字段。我希望可以从联接表中删除匹配的记录(从联接表中),即从10,500,000中删除所有212,000条记录。

我想知道使用Oracle SQL的最佳方法是什么?我见过示例,其中使用内部联接使用单个字段,并且使用delete语句从表2中删除table1,但未看到使用两个字段的一个(在联接中)。

在删除记录之前使用外部联接是否有意义?我本以为这可能会帮助我跟踪已删除的内容

sql oracle sql-delete
2个回答
2
投票
您无需使用OUTER JOIN,只需检查将要显示多少行。将

not删除。

这种查询的示例请参见下文(我使用答案末尾提供的生成的测试数据)

with del as ( select delta.id, delta.version, decode(big.id,null,0,1) is_deleted from delta left outer join big on delta.id = big.id and delta.version = big.version ) select is_deleted, count(*) cnt, max(id||'.'||version) eg_id_vers from del group by is_deleted; IS_DELETED CNT EG_ID_VERS ---------- ---------- ---------- 1 20000 99995.0 0 20 100100.0

根据您的数据大小,在两个表上都应使用HASH JOINfull table scan来获得可接受的性能。

基本上有两种选择方法DELETE

可更新的联接视图

请注意,在这种情况下,您的小表

必须在其上具有唯一索引

ID, VERSION(或主键)create unique index delta_idx on delta(id,version);
与BIG表相反,应

没有这样的约束

。这很重要,因为它清楚地表明BIG表是联接视图中唯一的一个[[键保存表。 由于唯一约束,简单地从大表连接到小表

不能复制行

请参见here有关更新联接视图]的更多信息]

delete from ( select delta.id, delta.version, big.id big_id, big.version from big join delta on delta.id = big.id and delta.version = big.version ) 上面的deleteBIG表中删除行,因为这是唯一的[[密钥保存表

(请参阅上面的讨论)]
此DML导致HASH JOIN

删除现有文件

如果小表没有主键(即它可以包含具有相同ID and VERSION的重复行),则必须

fallback到other answer中建议的解决方案。

DELETE FROM big WHERE EXISTS (SELECT null FROM delta WHERE delta.id = big.id and delta.version = big.version )

不需要索引,您应该期望使用HASH JOIN RIGHT SEMI的执行计划,这意味着这两种方法并没有真正的不同。

用于测试的样本数据

create table big as select trunc(rownum/10) id, mod(rownum,10) version, lpad('x',10,'Y') pad from dual connect by level <= 1000000; /* the DELTA table has 50 times less rows, allow some rows out of range of the BIG table - those rows will not be deleted **/ drop table delta; create table delta as select trunc(rownum*50/10) id, mod(rownum*50,10) version from dual connect by level <= 1001000/50; create unique index delta_idx on delta(id,version);

一种简单的方法只使用INEXISTS


1
投票
© www.soinside.com 2019 - 2024. All rights reserved.