Как получить данные из объединенной таблицы, которая содержит данные из базовой таблицы, которая будет обновлена? - PullRequest
0 голосов
/ 02 июля 2019

У меня есть следующий код, который обновляет базовую таблицу ORDERS_REPORT_BASE информацией, присоединяющейся к HOTLINKS. Обновление должно произойти, когда

1) SCAC в HOTLINKS соответствует любому из столбцов STD_CARR_CD в ORDERS_REPORT_BASE (STD_CARR_CD или STD_CARR_CD_EV_CDC или STD_CARR_CD_CUS или STD_CARR_CD_EV_CUS)

-> 1a Если STD_CARR_CD_EV_CUS имеет значение, то оно игнорирует все остальные и использует его. Если STD_CARR_CD_CUS имеет значение, а EV_CUS равен NULL, он использует его ... и так далее

2) CARR_TRACKING_NUM или ACTUAL_TRACKING_NUM не равны нулю в зависимости от случая

Кажется, 2) работает на основе результатов, однако 1) дает сбой при прохождении каждого CASE, так как когда он находит STD_CARR_CD, если он не совпадает, он не переходит к следующему сценарию.

Это код, который работает, но он не учитывает, существовал ли ранее SCAC

UPDATE GDTS.ORDERS_REPORT_BASE BASE SET BASE.HOTLINK = 
CASE WHEN BASE.CARR_TRACKING_NUM_CDC IS NULL AND BASE.ACTUAL_TRACKING_NUM IS NULL THEN NULL 
WHEN BASE.CARR_TRACKING_NUM_CDC IS NOT NULL AND BASE.ACTUAL_TRACKING_NUM IS NULL THEN TRIM(HOT.URL1) || TRIM(BASE.CARR_TRACKING_NUM_CDC) || TRIM(HOT.URL2) 
ELSE TRIM(HOT.URL1) || TRIM(BASE.ACTUAL_TRACKING_NUM) || TRIM(HOT.URL2) END
FROM (SELECT DISTINCT SCAC, URL1, URL2 FROM GDTS.HOTLINKS) HOT WHERE 
(TRIM(HOT.SCAC) = CASE WHEN BASE.STD_CARR_CD_EV_CUS IS NOT NULL
THEN BASE.STD_CARR_CD_EV_CUS
WHEN BASE.STD_CARR_CD_CUS IS NOT NULL AND BASE.STD_CARR_CD_EV_CUS IS NULL 
THEN BASE.STD_CARR_CD_CUS
WHEN BASE.STD_CARR_CD_EV_CDC IS NOT NULL AND BASE.STD_CARR_CD_CUS IS NOT NULL AND BASE.STD_CARR_CD_EV_CUS IS NULL
WHEN BASE.STD_CARR_CD IS NOT NULL AND BASE.STD_CARR_CD_EV_CDC IS NULL AND BASE.STD_CARR_CD_CUS IS NULL AND BASE.STD_CARR_CD_EV_CUS IS NULL
THEN BASE.STD_CARR_CD END)

В этом сценарии поле HOTLINK не обновляется, так как STD_CARR_CD_CUS не является пустым, но совпадение не приводит ни к какому результату ('MARUUN' не является SCAC в таблице HOTLINK)

no update as the match does not bring result

no MARUUN record in the HOTLINK table

Он должен был совпадать с STD_CARR_CD, который не равен нулю (значение ИБП)

Я пытался добавить предложение EXISTS при каждом равенстве HOT.SCAC, поэтому он также проверяет, что SCAC находится в таблице

...
FROM (SELECT DISTINCT SCAC, URL1, URL2 FROM GDTS.HOTLINKS) HOT WHERE 
(TRIM(HOT.SCAC) = CASE WHEN BASE.STD_CARR_CD_EV_CUS IS NOT NULL AND EXISTS (SELECT DISTINCT SCAC FROM GDTS.HOTLINKS WHERE TRIM(HOT.SCAC) = BASE.STD_CARR_CD_EV_CUS)
THEN BASE.STD_CARR_CD_EV_CUS
...

Однако это добавление привело к ошибке двойственности. Похоже, было несколько строк, извлеченных из таблицы BASE для обновления всего результата.

Ошибка: [IBM] [CLI Драйвер] [DB2 / LINUXX8664] SQL0788N Оператор не обработан потому что строка целевой таблицы \ "GDTS.ORDERS_REPORT_BASE \" была определено более одного раза для обновления, удаления или вставки. SQLSTATE = 21506

Введите ORDERS_REPORT_BASE - PO_ID, но для сопоставления с таблицей HOTLINKS мне нужно использовать любой из STD_CARR_CD против SCAC

Мне нужно проверить, что какой-либо из STD_CARR_CD существует в таблице HOTLINKS для CASE, чтобы рассмотреть его для создания логики сопоставления. Если его там нет (как в примере с изображением), он должен перейти к другому оператору CASE.

Спасибо

Ответы [ 2 ]

0 голосов
/ 03 июля 2019

Мне удалось проверить наличие SCAC в каждом операторе CASE с помощью

...
TRIM(HOT.SCAC) IN (SELECT SCAC FROM GDTS.HOTLINKS)
...

Спасибо!

0 голосов
/ 03 июля 2019

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

MERGE INTO target_table AS target
USING (

VALUES (1, 2, 3),
       (4, 5, 6),
       (7, 8, 9)
        -- more rows
        -- Or even you can use a complex join that gives the data set you want to alter
    ) AS source (C1, C2, C3)
    ON target.key_to_match = source.key_to_match
    WHEN MATCHED AND tab.C1 != source.C1 -- or any other condition if needed
    THEN UPDATE SET target.C1 = source.C1,
                   target.C2 = source.C2,
                   target.C3 = source.C3
    WHEN NOT MATCHED THEN
        INSERT (C1, C2, C3)
        VALUES (source.C1, source.C2, source.C3)
...