使用 Teradata 中增量 table 中的 MERGE/INSERT 将非重复项插入主 table
Insert non-duplicates to master table using MERGE/INSERT from Incremental table in Teradata
我遇到了这样一种情况,其中有一个大师 table 叫做 MORTALITY(包含有关已故个体的信息)和另一个 table 叫做 INC_MORTALITY(增量死亡率)table 每周刷新一次
注意:两个table的格式相似
所以 INC_MORTALITY 有本周的新记录,其中包含额外的已故人员以及之前交付记录的旧数据更新。这是一个文件,其中有一列 (OP_DIRECTIVE) 指定它是“添加”还是“删除”记录。
处理每周文件 要合并每周更新文件:我们需要在主 table 中添加行,其中 OP_DIRECTIVE = 'A' 作为每周更新中的操作。
我目前正在使用以下 stmt 插入记录
INSERT INTO db.MORTALITY
SELECT
DATA_SOURCE,
OP_DIRECTIVE,
DD_IMP_FLAG,
DOB,
DOD,
DEATH_VERIFICATION,
GENDER_PROBABILITY,
GENDER,
TOKEN_1,
TOKEN_2,
TOKEN_4,
TOKEN_5,
TOKEN_7,
TOKEN_16,
TOKEN_KEY
FROM db.INC_MORTALITY INC
WHERE INC.OP_DIRECTIVE = 'A';
--The above Query fetches all the records to be added to the Master Table - MORTALITY(My Requirement) and for some reason if INC_MORTALITY is not refreshed after a week i will be updating the same records again to the master file.
现在我更新了 table 定义中的 primary index (token_1, token_2)
,我知道如果我们尝试插入具有相同定义的记录,它会抛出 ERROR token_1 和 token_2 的值,但这将是一个自动化过程,如果出现 ERROR,我的工作将 FAIL所以,我希望它在插入过程之前检查记录是否已经插入,这样它就会跳过插入重复项
就像使用 IFNOTEXISTS stmt
添加到上面:我可以像下面这样使用 MERGE WHEN NOT MATCHED THEN INSERT
操作吗:
MERGE db.MORTALITY B
USING (SELECT
DATA_SOURCE,
OP_DIRECTIVE,
DD_IMP_FLAG,
DOB,
DOD,
DEATH_VERIFICATION,
GENDER_PROBABILITY,
GENDER,
TOKEN_1,
TOKEN_2,
TOKEN_4,
TOKEN_5,
TOKEN_7,
TOKEN_16,
TOKEN_KEY
FROM db.INC_MORTALITY
WHERE OP_DIRECTIVE = 'A') A
ON A.TOKEN_1 = B.TOKEN_1
AND A.TOKEN_2 = B.TOKEN_2
WHEN NOT MATCHED THEN
INSERT (A.DATA_SOURCE,A.OP_DIRECTIVE,A.DD_IMP_FLAG,A.DOB,A.DOD,A.DEATH_VERIFICATION,A.GENDER_PROBABILITY,A.GENDER,A.TOKEN_1,A.TOKEN_2,A.TOKEN_4,A.TOKEN_5,A.TOKEN_7,A.TOKEN_16,A.TOKEN_KEY);
上述查询在 Teradata Studio 中执行良好,但未插入任何来自 INC_MORTALITY TO MORTALITY(master) table 的记录,我做错了什么吗?
更新:
DROP TABLE IF EXISTS MORTALITY;
CREATE MULTISET TABLE MORTALITY,
NO BEFORE JOURNAL,
NO AFTER JOURNAL,
NO FALLBACK,
CHECKSUM = DEFAULT
(
DATA_SOURCE VARCHAR(25) NULL
TITLE 'Data Source',
OP_DIRECTIVE VARCHAR(25) NULL
TITLE 'Operation Directive',
DD_IMP_FLAG INTEGER NULL
TITLE 'Death Date Imputation Flag',
DOB DATE NULL
TITLE 'Date Of Birth',
DOD DATE NULL
TITLE 'Date Of Death',
DEATH_VERIFICATION INTEGER NULL
TITLE 'Death Verification',
GENDER_PROBABILITY FLOAT NULL
TITLE 'Gender Probability Score',
GENDER VARCHAR(25) NULL
TITLE 'Gender',
TOKEN_1 VARCHAR(44) NULL
TITLE 'Token 1',
TOKEN_2 VARCHAR(44) NULL
TITLE 'Token 2',
TOKEN_4 VARCHAR(44) NULL
TITLE 'Token 4',
TOKEN_5 VARCHAR(44) NULL
TITLE 'Token 5',
TOKEN_7 VARCHAR(44) NULL
TITLE 'Token 7',
TOKEN_16 VARCHAR(44) NULL
TITLE 'Token 16',
TOKEN_KEY VARCHAR(44) NULL
TITLE 'Token Key'
)
PRIMARY INDEX MORTALITY_IX1
(
TOKEN_1,
TOKEN_2
);
这是 MORTALITY 的 Table DDL,INC_MORTALITY 也有类似的格式。
TOKEN_1、TOKEN_2 这两个列的组合标识了一个唯一的记录,正如您在上面看到的那样,它们都是 NULLABLE 列
正如我之前所说,我的第一个 INSERT stmt 用于此目的,但我只是想避免出现这样的错误:Duplicate unique prime key error in db.MORTALITY
,如果记录已插入
希望信息对您有所帮助,谢谢
我自己做了一些研究并想出了以下方法:
1) 使用插入
这个查询对我有用,它只插入 INC_MORTALITY 但不在 MORTALITY 中的记录(避免重复)
INSERT INTO db.MORTALITY
SELECT * FROM db.INC_MORTALITY INC
WHERE INC.OP_DIRECTIVE = 'A'
EXCEPT
SELECT * FROM db.MORTALITY_INDEX
2) 同样使用 MERGE
MERGE db.MORTALITY MI
USING (SELECT
DATA_SOURCE,
OP_DIRECTIVE,
DD_IMP_FLAG,
DOB,
DOD,
DEATH_VERIFICATION,
GENDER_PROBABILITY,
GENDER,
TOKEN_1,
TOKEN_2,
TOKEN_4,
TOKEN_5,
TOKEN_7,
TOKEN_16,
TOKEN_KEY
FROM db.INC_MORTALITY
WHERE OP_DIRECTIVE = 'A') INC
ON MI.DATA_SOURCE = INC.DATA_SOURCE
AND MI.DD_IMP_FLAG = INC.DD_IMP_FLAG
AND MI.DOB = INC.DOB
AND MI.DOD = INC.DOD
AND MI.DEATH_VERIFICATION = INC.DEATH_VERIFICATION
AND MI.GENDER_PROBABILITY = INC.GENDER_PROBABILITY
AND MI.GENDER = INC.GENDER
AND MI.TOKEN_1 = INC.TOKEN_1
AND MI.TOKEN_2 = INC.TOKEN_2
AND MI.TOKEN_4 = INC.TOKEN_4
AND MI.TOKEN_5 = INC.TOKEN_5
AND MI.TOKEN_7 = INC.TOKEN_7
AND MI.TOKEN_16 = INC.TOKEN_16
AND MI.TOKEN_KEY = INC.TOKEN_KEY
WHEN NOT MATCHED THEN
INSERT (DATA_SOURCE,
OP_DIRECTIVE,
DD_IMP_FLAG,
DOB,
DOD,
DEATH_VERIFICATION,
GENDER_PROBABILITY,
GENDER,
TOKEN_1,
TOKEN_2,
TOKEN_4,
TOKEN_5,
TOKEN_7,
TOKEN_16,
TOKEN_KEY)
VALUES (INC.DATA_SOURCE,
INC.OP_DIRECTIVE,
INC.DD_IMP_FLAG,
INC.DOB,
INC.DOD,
INC.DEATH_VERIFICATION,
INC.GENDER_PROBABILITY,
INC.GENDER,
INC.TOKEN_1,
INC.TOKEN_2,
INC.TOKEN_4,
INC.TOKEN_5,
INC.TOKEN_7,
INC.TOKEN_16,
INC.TOKEN_KEY);
感谢所有对我的问题做出贡献的人!!
我遇到了这样一种情况,其中有一个大师 table 叫做 MORTALITY(包含有关已故个体的信息)和另一个 table 叫做 INC_MORTALITY(增量死亡率)table 每周刷新一次 注意:两个table的格式相似
所以 INC_MORTALITY 有本周的新记录,其中包含额外的已故人员以及之前交付记录的旧数据更新。这是一个文件,其中有一列 (OP_DIRECTIVE) 指定它是“添加”还是“删除”记录。
处理每周文件 要合并每周更新文件:我们需要在主 table 中添加行,其中 OP_DIRECTIVE = 'A' 作为每周更新中的操作。 我目前正在使用以下 stmt 插入记录
INSERT INTO db.MORTALITY
SELECT
DATA_SOURCE,
OP_DIRECTIVE,
DD_IMP_FLAG,
DOB,
DOD,
DEATH_VERIFICATION,
GENDER_PROBABILITY,
GENDER,
TOKEN_1,
TOKEN_2,
TOKEN_4,
TOKEN_5,
TOKEN_7,
TOKEN_16,
TOKEN_KEY
FROM db.INC_MORTALITY INC
WHERE INC.OP_DIRECTIVE = 'A';
--The above Query fetches all the records to be added to the Master Table - MORTALITY(My Requirement) and for some reason if INC_MORTALITY is not refreshed after a week i will be updating the same records again to the master file.
现在我更新了 table 定义中的 primary index (token_1, token_2)
,我知道如果我们尝试插入具有相同定义的记录,它会抛出 ERROR token_1 和 token_2 的值,但这将是一个自动化过程,如果出现 ERROR,我的工作将 FAIL所以,我希望它在插入过程之前检查记录是否已经插入,这样它就会跳过插入重复项
就像使用 IFNOTEXISTS stmt
添加到上面:我可以像下面这样使用 MERGE WHEN NOT MATCHED THEN INSERT
操作吗:
MERGE db.MORTALITY B
USING (SELECT
DATA_SOURCE,
OP_DIRECTIVE,
DD_IMP_FLAG,
DOB,
DOD,
DEATH_VERIFICATION,
GENDER_PROBABILITY,
GENDER,
TOKEN_1,
TOKEN_2,
TOKEN_4,
TOKEN_5,
TOKEN_7,
TOKEN_16,
TOKEN_KEY
FROM db.INC_MORTALITY
WHERE OP_DIRECTIVE = 'A') A
ON A.TOKEN_1 = B.TOKEN_1
AND A.TOKEN_2 = B.TOKEN_2
WHEN NOT MATCHED THEN
INSERT (A.DATA_SOURCE,A.OP_DIRECTIVE,A.DD_IMP_FLAG,A.DOB,A.DOD,A.DEATH_VERIFICATION,A.GENDER_PROBABILITY,A.GENDER,A.TOKEN_1,A.TOKEN_2,A.TOKEN_4,A.TOKEN_5,A.TOKEN_7,A.TOKEN_16,A.TOKEN_KEY);
上述查询在 Teradata Studio 中执行良好,但未插入任何来自 INC_MORTALITY TO MORTALITY(master) table 的记录,我做错了什么吗?
更新:
DROP TABLE IF EXISTS MORTALITY;
CREATE MULTISET TABLE MORTALITY,
NO BEFORE JOURNAL,
NO AFTER JOURNAL,
NO FALLBACK,
CHECKSUM = DEFAULT
(
DATA_SOURCE VARCHAR(25) NULL
TITLE 'Data Source',
OP_DIRECTIVE VARCHAR(25) NULL
TITLE 'Operation Directive',
DD_IMP_FLAG INTEGER NULL
TITLE 'Death Date Imputation Flag',
DOB DATE NULL
TITLE 'Date Of Birth',
DOD DATE NULL
TITLE 'Date Of Death',
DEATH_VERIFICATION INTEGER NULL
TITLE 'Death Verification',
GENDER_PROBABILITY FLOAT NULL
TITLE 'Gender Probability Score',
GENDER VARCHAR(25) NULL
TITLE 'Gender',
TOKEN_1 VARCHAR(44) NULL
TITLE 'Token 1',
TOKEN_2 VARCHAR(44) NULL
TITLE 'Token 2',
TOKEN_4 VARCHAR(44) NULL
TITLE 'Token 4',
TOKEN_5 VARCHAR(44) NULL
TITLE 'Token 5',
TOKEN_7 VARCHAR(44) NULL
TITLE 'Token 7',
TOKEN_16 VARCHAR(44) NULL
TITLE 'Token 16',
TOKEN_KEY VARCHAR(44) NULL
TITLE 'Token Key'
)
PRIMARY INDEX MORTALITY_IX1
(
TOKEN_1,
TOKEN_2
);
这是 MORTALITY 的 Table DDL,INC_MORTALITY 也有类似的格式。
TOKEN_1、TOKEN_2 这两个列的组合标识了一个唯一的记录,正如您在上面看到的那样,它们都是 NULLABLE 列
正如我之前所说,我的第一个 INSERT stmt 用于此目的,但我只是想避免出现这样的错误:Duplicate unique prime key error in db.MORTALITY
,如果记录已插入
希望信息对您有所帮助,谢谢
我自己做了一些研究并想出了以下方法:
1) 使用插入 这个查询对我有用,它只插入 INC_MORTALITY 但不在 MORTALITY 中的记录(避免重复)
INSERT INTO db.MORTALITY
SELECT * FROM db.INC_MORTALITY INC
WHERE INC.OP_DIRECTIVE = 'A'
EXCEPT
SELECT * FROM db.MORTALITY_INDEX
2) 同样使用 MERGE
MERGE db.MORTALITY MI
USING (SELECT
DATA_SOURCE,
OP_DIRECTIVE,
DD_IMP_FLAG,
DOB,
DOD,
DEATH_VERIFICATION,
GENDER_PROBABILITY,
GENDER,
TOKEN_1,
TOKEN_2,
TOKEN_4,
TOKEN_5,
TOKEN_7,
TOKEN_16,
TOKEN_KEY
FROM db.INC_MORTALITY
WHERE OP_DIRECTIVE = 'A') INC
ON MI.DATA_SOURCE = INC.DATA_SOURCE
AND MI.DD_IMP_FLAG = INC.DD_IMP_FLAG
AND MI.DOB = INC.DOB
AND MI.DOD = INC.DOD
AND MI.DEATH_VERIFICATION = INC.DEATH_VERIFICATION
AND MI.GENDER_PROBABILITY = INC.GENDER_PROBABILITY
AND MI.GENDER = INC.GENDER
AND MI.TOKEN_1 = INC.TOKEN_1
AND MI.TOKEN_2 = INC.TOKEN_2
AND MI.TOKEN_4 = INC.TOKEN_4
AND MI.TOKEN_5 = INC.TOKEN_5
AND MI.TOKEN_7 = INC.TOKEN_7
AND MI.TOKEN_16 = INC.TOKEN_16
AND MI.TOKEN_KEY = INC.TOKEN_KEY
WHEN NOT MATCHED THEN
INSERT (DATA_SOURCE,
OP_DIRECTIVE,
DD_IMP_FLAG,
DOB,
DOD,
DEATH_VERIFICATION,
GENDER_PROBABILITY,
GENDER,
TOKEN_1,
TOKEN_2,
TOKEN_4,
TOKEN_5,
TOKEN_7,
TOKEN_16,
TOKEN_KEY)
VALUES (INC.DATA_SOURCE,
INC.OP_DIRECTIVE,
INC.DD_IMP_FLAG,
INC.DOB,
INC.DOD,
INC.DEATH_VERIFICATION,
INC.GENDER_PROBABILITY,
INC.GENDER,
INC.TOKEN_1,
INC.TOKEN_2,
INC.TOKEN_4,
INC.TOKEN_5,
INC.TOKEN_7,
INC.TOKEN_16,
INC.TOKEN_KEY);
感谢所有对我的问题做出贡献的人!!