Внутреннее соединение с несколькими столбцами и использование в INSERT INSTO .... SELECT - PullRequest
0 голосов
/ 11 мая 2018

Таблица CUST_DAY0_MERGE имеет следующие столбцы

NEW_CUST_ID
ACTIVE_REF_ID
OLD_REF_ID_1
OLD_REF_ID_2
OLD_REF_ID_3

Я хочу создать оператор вставки в таблицу CUST_REVIEWS со следующими столбцами:

CUST_REVIEW_ID
RUN_DATE
CUST_ID
CUST_SOURCE_UNIQUE_ID
CUST_SOURCE_REF_ID

Эта вставкаоператор должен выполнить внутренний запрос соединения с CUST_DAY0_MERGE со следующими условиями:

CUST_DAY0_MERGE.OLD_REF_ID_1`=`CUST_REVIEWS.CUST_SOURCE_REF_ID
CUST_DAY0_MERGE.OLD_REF_ID_2`=`CUST_REVIEWS.CUST_SOURCE_REF_ID
CUST_DAY0_MERGE.OLD_REF_ID_3`=`CUST_REVIEWS.CUST_SOURCE_REF_ID

Если указанные выше условия выполняются, новая запись будет вставлена ​​в CUST_REVIEWS со следующими условиями:

CUST_REVIEWS.CUST_ID`=`CUST_DAY0_MERGE.NEW_CUST_ID
CUST_REVIEWS.CUST_SOURCE_UNIQUE_ID`=`CUST_DAY0_MERGE.NEW_CUST_ID

Для других столбцы должны оставаться неизменными в соответствии с существующим значением.

У меня есть пример оператора в следующем порядке:

INSERT INTO CUST_REVIEWS(CUST_REVIEW_ID,RUN_DATE,CUST_ID,CUST_SOURCE_UNIQUE_ID,CUST_SOURCE_REF_ID)
SELECT CUST_REVIEW_ID,RUN_DATE,CUST_ID,CUST_SOURCE_UNIQUE_ID,CUST_SOURCE_REF_ID
FROM CUST_REVIEWS reviews
INNER JOIN CUST_DAY0_MERGE merge1
ON (reviews.CUST_SOURCE_REF_ID = merge1.OLD_REF_ID_1)
INNER JOIN CUST_DAY0_MERGE merge2
ON (reviews.CUST_SOURCE_REF_ID = merge2.OLD_REF_ID_2)
INNER JOIN CUST_DAY0_MERGE merge3
ON (reviews.CUST_SOURCE_REF_ID = merge3.OLD_REF_ID_3);

Как можно улучшить оператор вставки, изменив CUST_ID иCUST_SOURCE_UNIQUE_ID с условием, которого я хотел бы достичь?

1 Ответ

0 голосов
/ 11 мая 2018

"Если вышеуказанные условия выполнены, новая запись будет вставлена ​​в CUST_REVIEWS" - вы имеете в виду

"Если хотя бы один из указанных выше" или
"Если все вышеперечисленное"?

Во втором случае вы можете использовать одиночное объединение:

INNER JOIN CUST_DAY0_MERGE merge
ON (reviews.CUST_SOURCE_REF_ID = merge.OLD_REF_ID_1)
AND
(reviews.CUST_SOURCE_REF_ID = merge.OLD_REF_ID_2)
AND
(reviews.CUST_SOURCE_REF_ID = merge.OLD_REF_ID_3)

В первом случае вы можете использовать «ИЛИ», но вместо этого сообщается, что «UNION» является более оптимальным:

INNER JOIN CUST_DAY0_MERGE merge
    ON (reviews.CUST_SOURCE_REF_ID = merge.OLD_REF_ID_1)
    OR
    (reviews.CUST_SOURCE_REF_ID = merge.OLD_REF_ID_2)
    OR
    (reviews.CUST_SOURCE_REF_ID = merge.OLD_REF_ID_3)

против

       INSERT INTO CUST_REVIEWS(CUST_REVIEW_ID,RUN_DATE,CUST_ID,CUST_SOURCE_UNIQUE_ID,CUST_SOURCE_REF_ID)  

       SELECT CUST_REVIEW_ID,RUN_DATE,merge.NEW_CUST_ID as CUST_ID,merge.NEW_CUST_ID as CUST_SOURCE_UNIQUE_ID,CUST_SOURCE_REF_ID
FROM CUST_REVIEWS reviews
       INNER JOIN CUST_DAY0_MERGE merge
           ON (reviews.CUST_SOURCE_REF_ID = merge.OLD_REF_ID_1)

       UNION
       SELECT CUST_REVIEW_ID,RUN_DATE,merge.NEW_CUST_ID as CUST_ID,merge.NEW_CUST_ID as CUST_SOURCE_UNIQUE_ID,CUST_SOURCE_REF_ID
FROM CUST_REVIEWS reviews    
       INNER JOIN CUST_DAY0_MERGE merge
          ON (reviews.CUST_SOURCE_REF_ID = merge.OLD_REF_ID_2)

       UNION
       SELECT CUST_REVIEW_ID,RUN_DATE,merge.NEW_CUST_ID as CUST_ID,merge.NEW_CUST_ID as CUST_SOURCE_UNIQUE_ID,CUST_SOURCE_REF_ID
FROM CUST_REVIEWS reviews    
       INNER JOIN CUST_DAY0_MERGE merge
          ON (reviews.CUST_SOURCE_REF_ID = merge.OLD_REF_ID_3)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...