即使存在多个类似列(Teradata),也只能从Target表中删除一列



我遇到了一种情况,我必须根据其他表中的条件从表中删除一列让我把它分解给你!

有一个名为MORTALITY的主表(包含有关死者的信息(另一个名为INC_MORTALITY(增量死亡率(表的表每周更新一次注:两个表格的格式相似

因此,本周的新记录,既包含额外的死者,也包含先前交付记录的旧数据更新。这是一个单独的文件,其中有一列(OP_DIRECTIVE(指定它是"添加"还是"删除"记录。

处理每周文件要合并每周更新文件,我们需要按顺序执行以下步骤。1.删除主表中OP_DIRECTIVE='D'作为每周更新操作的行。对于给定的删除行,您应该删除主表中的一行,该行与除"D"操作列之外的所有字段上的删除记录相匹配。警告:请确保只删除一条记录或将其标记为已删除,即使有多条历史记录与此新删除记录完全匹配。u20282.在主表中添加出现在"添加"文件中的行。u2028完成这些步骤后,您的主表应该是最新的死亡主表。

(注意:这些表格没有主键(所以我尝试了:

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 work_table SELECT MI.col1, MI.col2, ...
FROM 
(SELECT M.*,
ROW_NUMBER() OVER (PARTITION BY <join cols> ORDER BY <some col(s)>) AS ROWNUM
FROM MORTALITY M) MI
LEFT JOIN 
(SELECT I.*, 
ROW_NUMBER() OVER (PARTITION BY <join cols> ORDER BY <some col(s)>) AS ROWNUM
FROM INC_MORTALITY I
WHERE OP_DIRECTIVE='D') INC
ON MI.join_col1 = INC.join_col1
AND MI.join_col2 = INC.join_col2
...
AND MI.ROWNUM = INC.ROWNUM
WHERE INC.ROWNUM IS NULL /* "anti-join" keeps only unmatched rows */
;
DELETE FROM MORTALITY;
INSERT MORTALITY SELECT * FROM work_table;

如果INC_MORTALILTY从不具有重复项,则可以取消对该关系的编号,并将最后一个联接条件更改为MI.ROWNUM = 1,并使用其他一个join列进行NULL检查。

最新更新