根据第二个表中的多列值删除一个表中的记录

Tom*_*Tom 4 db2

我需要根据表2中多列的数据插入和删除表1中的记录。

示例:表 1 和表 2 具有相同的列:地址、城市、州和邮编。

表 1 是具有数百万条记录的主表。表 2(千条记录)是基于以某种方式更改的数据的表 - 尽管它可能不是此表中的数据更改。

匹配记录意味着地址、城市、州和邮政编码在两个表中的值相同。

所以我想做两个操作:

  • 将只存在于表2中的记录插入到表1中
  • 从表1中删除记录不在表2中但城市在表2中的记录

根据 Table1 的大小,我需要一种非常有效的方法来执行此操作。我知道一些 SQL - 但没有达到如果使用 SQL 完成所需的级别。

这是一个 DB2 数据库 - 版本 10.5。

ype*_*eᵀᴹ 5

  • 操作 1

    插入Table1只存在于 中的记录Table2

    INSERT INTO Table1
        (address, city, state, zip)
    SELECT address, city, state, zip  FROM Table2
    EXCEPT
    SELECT address, city, state, zip  FROM Table1 ;
    
    Run Code Online (Sandbox Code Playgroud)
  • 操作2

    从删除记录Table1,其中记录不在Table2,但cityTable2

    (假设列不可为空。如果它们允许空值,最好NOT INNOT EXISTS子查询重写):

    DELETE FROM Table1 
    WHERE (address, city, state, zip)
           NOT IN
          (SELECT address, city, state, zip  FROM Table2)
      AND city IN
          (SELECT city FROM Table2) ;
    
    Run Code Online (Sandbox Code Playgroud)

至于性能和效率,我对 DB2 的经验几乎为零,所以如果您等待其他答案会更好。但是所有列(address, city, state, zip)上的索引——在两个表上——可能是你能为查询做的最好的,再加上一个单一的索引(city)。或者也许将两个建议与所有 4 列合并在一个索引中,但选择city索引的第一部分:(city, address, state, zip).

您尚未提供表的结构,但 4 列似乎适合UNIQUE约束,因此您可能已经有了这样的索引。