【问题标题】:DELETE else UPDATE from temp table从临时表中删除其他更新
【发布时间】:2018-11-25 23:02:34
【问题描述】:

这似乎很容易,但我已经找了几个小时了。

如何在目标表中插入临时表中不存在的行, 并同时删除临时表中确实存在的目标表中的行?它必须是交易安全的,在 teradata 中,并且如果可能的话是高性能的。

MERGE 显然不支持同时删除和插入。

【问题讨论】:

    标签: merge teradata


    【解决方案1】:

    除了临时/工作表之外,您还可以使用 BTET 来确保删除和插入事务的安全。 示例如下所示

    CREATE TABLE temp_Table_2 AS (SELECT * FROM target_Table WHERE EXISTS (SELECT 1 FROM temp_Table WHERE target_Table.key_cols = temp_Table.key_cols)) WITH DATA;
    
    BT;
    
    --First delete rows which are present in temp table
    DELETE FROM target_Table WHERE EXISTS (SELECT 1 FROM temp_Table WHERE target_Table.key_cols = temp_Table.key_cols);
    
    --Second Insert rows which were not exist in target table 
    INSERT INTO target_Table
    col_1,
    col_1,
    .
    .
    col_n
    )
    SELECT 
    col_1,
    col_1,
    .
    .
    col_n
     FROM temp_Table
    WHERE  NOT EXISTS (SELECT 1 FROM temp_Table_2 WHERE temp_Table_2.key_cols = temp_Table.key_cols);
    
    ET;
    
    DROP TABLE temp_Table_2;
    

    注意:如果有任何第三个表要从其中插入行到临时表中不存在的目标表中,则可以调整示例

    【讨论】:

    • INSERT 应该编码为 MERGE,因为这可能更有效(避免假脱机)。并且可以使用 MultiStatement 来代替 BT/ET。
    • 感谢 Dnoeth,MultiStatement 似乎比 BT/ET 更好。
    • 但是多语句不是交易安全的,或者?
    • 另外,MERGE 是否比简单的 INSERT...SELECT 更有效?这怎么可能?
    • 哦,最后你还要插入你想删除的行;)
    猜你喜欢
    • 2021-03-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-22
    相关资源
    最近更新 更多