【问题标题】:Delete only one column from the Target table even if there are multiple similar columns (Teradata)即使有多个相似的列(Teradata),也只从目标表中删除一列
【发布时间】: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


【解决方案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 检查。

【讨论】:

  • 太棒了,这就是我要找的东西:D
猜你喜欢
  • 2019-03-22
  • 2021-03-15
  • 2013-01-11
  • 2022-12-20
  • 1970-01-01
  • 1970-01-01
  • 2014-08-11
  • 1970-01-01
  • 2020-12-05
相关资源
最近更新 更多