【问题标题】:Oracle Merge - Can I do something like "When Not Matched Then Delete"?Oracle 合并 - 我可以执行“当不匹配时删除”之类的操作吗?
【发布时间】:2020-09-29 01:23:54
【问题描述】:

我有一张表 (t1),其中包含唯一的患者列表。我有另一个表(t1_Backup),其中包含重复的患者列表和详细信息。我想基本上执行一个内部连接来更新 t1,它为 t1_Backup 中包含的详细信息列设置了空值集。 t1_Backup 也有一些我要在连接中删除的记录。

MERGE INTO t1
USING (SELECT * FROM
         (SELECT t1_Backup.*
            ,RANK() OVER (PARTITION BY Patient_ID ORDER BY Col1 DESC, Col2 DESC, ...) AS Pick
         FROM t1_Backup
         WHERE Active_Status = 'A')
      WHERE Pick = 1)
   t2 ON (t1.Patient_ID = t2.Patient_ID)
WHEN MATCHED THEN UPDATE
SET
    t1.Col1 = t2.Col2
    t1.Col2 = t2.Col2
....

ad infinitum(不是字面意思,但正如您可能猜到的那样,我只是在更新大量列——整个练习是从 t2 中删除重复项的精心尝试。数据很复杂,但如果有人对其他方法有建议,我我全神贯注。)

对于那些密切关注的人,您可能已经注意到 Active_Status = 'A' 标准可能具有限制性效果,导致我有一些未更新的 Patient_ID。鉴于我的要求,我实际上想简单地通过一个快速、整洁的步骤删除这些行。

简而言之,我的问题是是否可以添加一行代码,例如 WHEN NOT MATCHED THEN DELETE?

我想知道在运行类似的东西之前会发生什么。谢谢!

【问题讨论】:

    标签: sql oracle merge inner-join


    【解决方案1】:

    指定 DELETE where_clause 以在填充或更新表时清理表中的数据。受此子句影响的唯一行是目标表中由合并操作更新的那些行。 DELETE WHERE 条件评估更新的值,而不是由 UPDATE SET ... WHERE 条件评估的原始值。如果目标表的一行满足 DELETE 条件但不包含在 ON 子句定义的连接中,则不删除。在目标表上定义的任何删除触发器都将在每次删除行时激活。

    MERGE

    【讨论】:

    • 感谢您的回答和对 Oracle 文档的指导。您能否确认以下代码将生成更新的 t1 而没有被丢弃的 t2 患者? MERGE INTO t1 USING (SELECT * FROM (SELECT t1_Backup.* ,RANK() OVER (PARTITION BY Patient_ID ORDER BY Col1 DESC, Col2 DESC, ...) AS Pick FROM t1_Backup WHERE Active_Status = 'A') WHERE Pick = 1) t2 ON (t1.Patient_ID = t2.Patient_ID) WHEN MATCHED THEN UPDATE SET t1.Col1 = t2.Col2 t1.Col2 = t2.Col2 DELETE WHERE t1.Col1 IS NULL
    • delete where 子句只能删除 t1 中的行,该行必须由merge 更新。它不会影响 t1_backup。见demo
    猜你喜欢
    • 2021-08-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-05-28
    • 2014-10-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多