【发布时间】:2019-08-02 21:52:46
【问题描述】:
谁能告诉我这个插入语句有什么问题? 如果 USER_ID、OBJECT 和 DATE 的组合不存在,我正在尝试从 PERMS_STG2 表将新行插入到 USERS_AND_USAGE_STG2 表中。
USERS_AND_USAGE_STG2 具有唯一键 DATE、USER_ID 和 OBJECT。 当我运行下面的语句时,它会出现“INSERT Failed. 2801: Duplicate unique prime key error in.....”错误 **我意识到暂存表通常没有唯一键,但它告诉我我的“如果不存在则插入”工作不正常。
INSERT INTO WORK1.USERS_AND_USAGE_STG2
(EFF_DT
,USER_ID
,SP_ADDED_DT
,OBJECT
,ACCESS_IS_ACTIVE)
SELECT
EFF_DT
,USER_ID
,EFF_DT
,COMBO_NAME
,'Y'
FROM WORK1.PERMS_STG2 P
WHERE NOT EXISTS (SELECT USER_ID, OBJECT
FROM WORK1.USERS_AND_USAGE_STG2
WHERE USER_ID = P.USER_ID
AND OBJECT = P.COMBO_NAME
AND EFF_DT = P.EFF_DT);
【问题讨论】:
-
也许您在
WORK1.PERMS_STG2的那个USER_ID, OBJECT, EFF_DT键上有重复项?当你运行SELECT * FROM WORK1.PERMS_STG2 QUALIFY COUNT(*) OVER (PARTITION BY USER_ID, EFF_DT, COMBO_NAME) > 1;时,你得到结果了吗?如果是这样,那么您的PERMS_STG2表有重复项,您必须解决(选择一个或另一个并插入)。 -
这些列中是否存在 NULL?顺便说一句,在解决问题后,您可以尝试 MERGE WHEN NOT FOUND
-
也许你可以用
SELECT * FROM ( SELECT EFF_DT ,USER_ID ,EFF_DT ,COMBO_NAME ,'Y' FROM WORK1.PERMS_STG2 P WHERE NOT EXISTS (SELECT USER_ID, OBJECT FROM WORK1.USERS_AND_USAGE_STG2 WHERE USER_ID = P.USER_ID AND OBJECT = P.COMBO_NAME AND EFF_DT = P.EFF_DT) UNION ALL SELECT EFF_DT ,USER_ID ,SP_ADDED_DT ,OBJECT ,ACCESS_IS_ACTIVE FROM WORK1.USERS_AND_USAGE_STG2) dt QUALIFY COUNT(*) OVER PARTITION BY (USER_ID, EFF_DT, COMBO_NAME) > 1;之类的东西来识别重复项 -
您确定
USERS_AND_USAGE_STG2中的唯一 PI 列是您在您不存在子句中使用的那些吗? -
您可以在不更新的情况下进行插入合并。