объединить или вставить игнорировать для db2 - PullRequest
0 голосов
/ 07 октября 2019

Я чувствую, что это должно быть довольно просто, но у меня проблема с поиском лучшего способа сделать это

У меня есть несколько подэлементов в этой таблице subitem_to_item_status, которые имеют статус, но мне нужновставить запись для всех подэлементов, которые еще не там. Мне не нужно обновлять то, что там, я просто пытаюсь реплицировать 'insert / ignore'

Пример данных для подэлементов

ITEM_SUBITEMT

item_subitem_id   |   creator_identifier
-----------------------------------------
12                      12345
13                      12345
14                      12345
15                      12345
16                      12345
17                      12345
18                      12345
19                      12345
20                      12345
21                      12345
22                      12345

SUBITEM_TO_ITEM_STATUS

SUBITEM_ID   |   ITEM_STATUS_ID   |   CREATED_BY_IDENTIFIER   
------------------------------------------------------------
12                  1                   12345
15                  1                   12345
16                  1                   12345
20                  1                   12345

Итак, с этими данными мне просто нужно вставить записи из первой таблицы, у которых нет идентификатора 12,15,16 или 20

    MERGE INTO schema.SUBITEM_TO_ITEM_STATUS (SUBITEM_ID,ITEM_STATUS_ID, CREATED_BY_IDENTIFIER,ROWCHANGE,CREATED_AT) AS T
    USING( (SELECT ITEM_SUBITEM_ID, 1, CREATOR_IDENTIFIER, NOW(),NOW() FROM schema.ITEM_SUBITEMT) AS S
    ON S.ITEM_SUBITEM_ID = T.SUBITEM_ID
    WHEN NOT MATCHED THEN INSERT;

Ответы [ 2 ]

1 голос
/ 07 октября 2019

Неверное MERGE утверждение.
Попробуйте это:

MERGE INTO schema.SUBITEM_TO_ITEM_STATUS T
USING (SELECT ITEM_SUBITEM_ID, 1 AS ITEM_STATUS_ID, creator_identifier FROM schema.ITEM_SUBITEMT) S ON S.ITEM_SUBITEM_ID = T.SUBITEM_ID
WHEN NOT MATCHED THEN 
INSERT (SUBITEM_ID, ITEM_STATUS_ID, CREATED_BY_IDENTIFIER) 
VALUES (S.item_subitem_id, S.ITEM_STATUS_ID, S.creator_identifier);
0 голосов
/ 07 октября 2019

Почему бы не использовать insert?

insert into SUBITEM_TO_ITEM_STATUS (SUBITEM_ID, ITEM_STATUS_ID, CREATED_BY_IDENTIFIER)
   select item_subitem_id, 1, creator_identifier
   from ITEM_SUBITEMT
   where item_subitem_id not in (12, 15, 16, 20);

Если вы имеете в виду, что вам не нужны дубликаты в таблице, вы можете попробовать:

insert into SUBITEM_TO_ITEM_STATUS (SUBITEM_ID, ITEM_STATUS_ID, CREATED_BY_IDENTIFIER)
   select item_subitem_id, 1, creator_identifier
   from ITEM_SUBITEMT s
   where not exists (select 1
                     from SUBITEM_TO_ITEM_STATUS tis
                     where tis.item_subitem_id = s.item_subitem_id
                    );
...