2012-06-09 2 views
0

Мне нужно объединить данные из одной таблицы в другую.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'; 

я получить правильные результаты.

Есть ли у кого-нибудь идеи, что не так в запросе?

ответ

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) 
Смежные вопросы