在正确的where子句中,db2 merge似乎失败了

时间:2012-06-09 09:34:09

标签: sql merge db2

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

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

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

加载表为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

此查询失败,并显示以下错误:

  

无法将数据从舞台更新到生产表保留。   [[23505] [IBM] [CLI驱动程序] [DB2 / LINUXX8664] SQL0803N一个或多个   INSERT语句,UPDATE语句或外键中的值   由DELETE语句引起的更新无效,因为主要   密钥,唯一约束或由“1”约束标识的唯一索引   表“DLP.RESERVATION”来自索引的重复值   键。 SQLSTATE = 23505

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

当我跑步时:

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

我得到了正确的结果。

有没有人知道查询有什么问题?

1 个答案:

答案 0 :(得分:0)

好吧,我解决了。

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

示例:

    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)