【问题标题】:db2 merge seems to fail on correct where clausedb2 合并似乎在正确的 where 子句上失败
【发布时间】:2012-06-13 03:56:56
【问题描述】:

我需要将数据从一个表合并到另一个表。

数据通过平面文件传递。这就是为什么我在将其投入生产之前首先使用负载表的原因。

我在加载表中添加了一个字段loadtabletime,因此我可以告诉db2 一次只合并一个文件,即使一次在加载表中插入了多个文件。

负载表为loaddlp.reservation_insert,生产表为dlp.reservation

这是我的查询:

MERGE INTO DLP.RESERVATION AS E 
USING LOADDLP.RESERVATION_INSERT as et 
   on e.TICKET_SERVER = et.TICKET_SERVER 
  and e.RES_ID = et.RES_ID 
  and et.LOADTABLETIME = '2012-06-09 10:44:17.42236' 
 WHEN MATCHED THEN UPDATE SET (foo) = (bar) 
 WHEN NOT MATCHED THEN INSERT (xyz) VALUES (;akdjf)

加载表的主键是ticket_serverres_idloadtabletime;对于 prod 表,它是 ticket_serverres_id

此查询失败并出现以下错误:

无法将数据从阶段更新到生产表 RESERVATION。 [[23505] [IBM][CLI Driver][DB2/LINUXX8664] SQL0803N 一个或多个 INSERT 语句、UPDATE 语句或外键中的值 由 DELETE 语句引起的更新无效,因为主 由“1”约束标识的键、唯一约束或唯一索引 表“DLP.RESERVATION”具有重复的索引值 钥匙。 SQLSTATE=23505

但是,当我从 where 子句中删除 loadtabletime 时,它神奇地起作用了。当然,这不是一个选项,因为当将多个文件加载到加载表中时,插入时可能会出现 pk 违规。

当我跑步时:

SELECT count(*) 
  from loaddlp.reservation_insert 
 where LOADTABLETIME = '2012-06-09 10:44:17.42236';

我得到了正确的结果。

有人知道查询出了什么问题吗?

【问题讨论】:

    标签: sql merge db2


    【解决方案1】:

    好的,我解决了。

    关键是在“使用”字段中添加了一个选择查询。

    例子:

        MERGE INTO DLP.RESERVATION AS e
    USING (select * from LOADDLP.RESERVATION_INSERT WHERE LOADTABLETIME = '2012-06-09 10:44:17.42236') as et 
       on e.TICKET_SERVER = et.TICKET_SERVER 
      and e.RES_ID = et.RES_ID  
     WHEN MATCHED THEN UPDATE SET (foo) = (bar) 
     WHEN NOT MATCHED THEN INSERT (xyz) VALUES (;akdjf)
    

    【讨论】:

      猜你喜欢
      • 2013-01-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-11-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多