Мне нужно объединить данные из одной таблицы в другую.db2 merge, похоже, терпит неудачу на правильном месте где
Данные доставляются через плоские файлы. Вот почему я сначала использую загрузочную таблицу, прежде чем переносить ее в производство.
Я добавляю поле 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_server
, res_id
и loadtabletime
; для таблицы prod это ticket_server
и res_id
.
Этот запрос не будет со следующей ошибкой:
Could not Update data from the stage to production table RESERVATION. [[23505] [IBM][CLI Driver][DB2/LINUXX8664] SQL0803N One or more values in the INSERT statement, UPDATE statement, or foreign key update caused by a DELETE statement are not valid because the primary key, unique constraint or unique index identified by "1" constrains table "DLP.RESERVATION" from having duplicate values for the index key. SQLSTATE=23505
Но, когда я удалить loadtabletime
из пункта where
магически работает. Конечно, это не вариант, когда при загрузке нескольких файлов в таблицу загрузки вы можете иметь нарушения pk при вставке.
Когда я бегу:
SELECT count(*)
from loaddlp.reservation_insert
where LOADTABLETIME = '2012-06-09 10:44:17.42236';
я получить правильные результаты.
Есть ли у кого-нибудь идеи, что не так в запросе?