teradata - 即使有多个相似的列(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
有关如何处理这种情况的任何建议,谢谢!
解决方案
解决方法:将不匹配的行复制到工作表中,然后截断原始表并替换为工作表的内容。识别不匹配行的一种方法是使用唯一编号标记一组重复项中的每个输入行,如下所示:
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 检查。
推荐阅读
- pytorch - 数据集标记为未找到或损坏,但数据集未损坏
- amazon-web-services - 从私有子网到公共子网的请求
- laravel - 如何使复选框填充laravel中已经给定的数据
- sql - 我该如何解决,ORA-02291:违反完整性常数 - 未找到父密钥
- amazon-web-services - 如何为 EKS 配置子网?
- javascript - 不和谐头像嵌入
- html - 带有选项卡面板的引导 4 列表组:仅在活动时显示内容
- android - 片段中的 RecycleView + CardView
- sql - 了解 BigQuery 数组交叉联接中引用的表
- linux - 在 MacOS 中通过 openVPN 从 VM 路由互联网流量