【问题标题】:Teradata - Insert new rows onlyTeradata - 仅插入新行
【发布时间】: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 列是您在您不存在子句中使用的那些吗?
  • 您可以在不更新的情况下进行插入合并。

标签: sql teradata


【解决方案1】:

上面的代码是/是正确的。我的源数据有问题。 @JNevill 指出这一点值得称赞。

【讨论】:

    猜你喜欢
    • 2017-02-01
    • 2013-11-23
    • 1970-01-01
    • 2021-01-01
    • 2019-06-03
    • 1970-01-01
    • 2013-05-16
    • 2019-03-28
    • 1970-01-01
    相关资源
    最近更新 更多