У меня есть следующий код, который обновляет базовую таблицу 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)
Он должен был совпадать с 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.
Спасибо