【发布时间】:2020-07-30 06:06:49
【问题描述】:
我遇到了一种情况,我必须根据其他表中的条件从表中删除一列 让我把它分解给你!
有一个名为 MORTALITY 的主表(包含有关已故个人的信息) 另一个名为 INC_MORTALITY(增量死亡率)的表每周刷新一次 注意:两个表的格式相似
因此,本周的新记录既包含其他死者,也包含先前交付记录的旧数据更新。这是一个带有列 (OP_DIRECTIVE) 的单个文件,指定它是“添加”还是“删除”记录。
处理每周文件 要合并每周更新文件,我们需要按顺序执行以下步骤。 1. 删除主表中OP_DIRECTIVE = 'D' 作为每周更新操作的行。对于给定的删除行,您应该删除主表中与除“D”操作列之外的所有字段上的删除记录匹配的单行。警告:请确保您只删除或标记为已删除一条记录,即使有多个历史记录与这条新删除记录完全匹配。 2. 在“添加”文件中出现的主表中添加行。 完成这些步骤后,您的主表应该是最新的死亡主表。
 (注意:这些表没有主键) 所以我尝试了:
DEL FROM MORTALITY MI
WHERE MI.DATA_SOURCE = INC_MORTALITY.DATA_SOURCE
AND MI.DD_IMP_FLAG = INC_MORTALITY.DD_IMP_FLAG
AND MI.DOB = INC_MORTALITY.DOB
AND MI.DOD = INC_MORTALITY.DOD
AND MI.DEATH_VERIFICATION = INC_MORTALITY.DEATH_VERIFICATION
AND MI.GENDER_PROBABILITY = INC_MORTALITY.GENDER_PROBABILITY
AND MI.GENDER = INC_MORTALITY.GENDER
AND MI.TOKEN_1 = INC_MORTALITY.TOKEN_1
AND MI.TOKEN_2 = INC_MORTALITY.TOKEN_2
AND MI.TOKEN_4 = INC_MORTALITY.TOKEN_4
AND MI.TOKEN_5 = INC_MORTALITY.TOKEN_5
AND MI.TOKEN_7 = INC_MORTALITY.TOKEN_7
AND MI.TOKEN_16 = INC_MORTALITY.TOKEN_16
AND MI.TOKEN_KEY = INC_MORTALITY.TOKEN_KEY
AND INC_MORTALITY.OP_DIRECTIVE = 'D'
上面的Delete语句会删除所有满足条件的行,我的要求是即使多条历史记录完全匹配这条新的删除记录,也只删除一条记录, 如果我在下面包含 ROW NUMBER() stmt,我的 DELETE stmt 不起作用
QUALIFY ROW_NUMBER() OVER (PARTITION BY MI.DATA_SOURCE,MI.DOB,MI.DOD
ORDER BY MI.DOD DESC ) = 1
关于如何处理这种情况的任何建议,谢谢!
【问题讨论】:
-
如果你有两个相同的行,你不能只删除或更新其中一个;它总是两者兼而有之。但是您可以选择仅将不匹配的行作为 INSERT/SELECT 的一部分保留到新(或临时)表中,然后用该结果替换原始表的全部内容。
-
谢谢@Fred 你能详细说明一下吗? (我的同事也给了我类似的建议)
标签: teradata delete-row