首页 > 解决方案 > 即使有多个相似的列(Teradata),也仅从目标表中删除一列

问题描述

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

有一个名为 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

有关如何处理这种情况的任何建议,谢谢!

标签: teradatadelete-row

解决方案


解决方法:将不匹配的行复制到工作表中,然后截断原始表并替换为工作表的内容。识别不匹配行的一种方法是使用唯一编号标记一组重复项中的每个输入行,如下所示:

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 检查。


推荐阅读