清理具有孤立记录的表

omvjsjqw  于 2021-07-26  发布在  Java
关注(0)|答案(3)|浏览(302)

我得把这些孤立的记录删除 Base Table .
基表

id | raw_data | unit    
1  | 20 | kg    
2  | 30 | km    
3  | 10 | s    
4  | 10 | s    
5  | 20 | km/s
    6  | 70 | mpg

表a

id | field_1 | field_2    
1  | 1 | 2

表b

id | field_1 | field_2    
1  | 3 | 4

这个 field_1 以及 field_2 两者都有 Table A 以及 Table B 是指 Base Table 的主键。
从年起 Base Table id为5和6的记录没有从任何表中引用,这两个是孤立记录,我想将其从数据库中删除。

delete from base_table base
where not exists (select from table_a a where base.id = a.field_1
                    or base.id = a.field_2 ) 

                    and not exists (select from table_b b where base.id = b.field_1
                    or base.id = b.field_2)

问题是如果我的 Base Table 有很多记录(250万)。我可能有10张这样的table Table A 或者 Table B 有数据表明 Base Table .
如何清理上的孤立记录 Base Table ?

42fyovps

42fyovps1#

也许只是使用 UNION 获取的所有ID field_1 以及 field_2table_a 以及 table_b ,并使用 NOT IN 过滤。

delete from base_table 
where id NOT IN(
    select distinct field_1 from table_a
    union
    select distinct field_2 from table_a
    union
    select distinct field_1 from table_b
    union
    select distinct field_2 from table_b
)
vwhgwdsa

vwhgwdsa2#

您当前的查询在逻辑上是正确的,并且可能已经是最佳选择。您可以考虑为a和b表编制索引:

CREATE INDEX idx_A ON TableA (field_1, field_2);
CREATE INDEX idx_B ON TableB (field_1, field_2);

这可能会加快当前delete查询中的exists查找速度,可能会使它们大大加快。

f2uvfpb9

f2uvfpb93#

or 会毁了你的表演。我建议将代码编写为:

delete from base_table base
    where not exists (select 1
                      from table_a a
                      where base.id = a.field_1
                     ) and
           not exists (select 1
                      from table_a a
                      where base.id = a.field_2
                     ) and
           not exists (select 1
                       from table_b b
                       where base.id = b.field_1
                      ) and
           not exists (select 1
                       from table_b b
                       where base.id = b.field_2
                      ) ;

然后,需要以下索引:
table_a(field_1) table_a(field_2) table_b(field_1) table_b(field_2) 您可以使用 select 查询。

相关问题