即使有多个相似的列 (Teradata),也只从 Target table 中删除一列

Delete only one column from the Target table even if there are multiple similar columns (Teradata)

我遇到过这样一种情况,我必须根据其他 table 的条件从 table 中删除一列 让我给你分解一下!

有一个叫 MORTALITY 的大师table(包含有关已故个体的信息) 另一个 table 称为 INC_MORTALITY(增量死亡率)table,每周更新一次 注意:table 的格式相似

所以本周的新记录,包含额外的死者以及对先前交付记录的旧数据的更新。这是一个单独的文件,其中有一列 (OP_DIRECTIVE) 指定它是“添加”还是“删除”记录。

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

✿ (注意:这些表没有主键) 所以我尝试了什么:

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

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

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

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