2016-02-05 2 views
0

Я хочу обновить таблицу MA_PARTICIPANT, используя MERGE UPDATE CLAUSE. Я хочу, чтобы обновить две колонки:SQL ORACLE MERGE Таблица

MA_PARTICIPANT.CUSTOMER_RK,MA_PARTICIPANT.DEACT_FLG. CUSTOMER_RK будет обновляться с моим вторым столом TABLE_CHANGE который состоит две колонки: -

CUSTOMER_RK,NEW_CUSTOMER_RK. MA_PARTICIPANT.DEACT_FLG в таблице MA_PARTICIPANT может быть «Y» или «N», и если это «N», то я должен изменить его на «Y», но если он уже «Y», то я не должен обновлять этот столбец. Слияние таблиц будет на MA_PARTICIPANT.part_id = TABLE_CHANGE.part_id, но я не знаю, как использовать слияние с условием на MA_PARTICIPANT.DEACT_FLG.

Наконец, каждый CUSTOMER_RK который я обновить должен имеет FLG = 'Y'

простой пример MA_PARTICIPANT:

PART_ID CUSTOMER_RK DEACT_FLG 
1   10   Y 
2   10   N 
3   20   Y 

простой пример TABLE_TO_CHANGE:

PART_ID CUSTOMER_RK NEW_CUSTOMER_RK 
1   10   100 
2   10   100 
3   20   200 

MA_PARTICIPANT после обновления:

PART_ID CUSTOMER_RK DEACT_FLG 
1   100   Y 
2   100   Y 
3   200   Y 

Я полагаю, что это будет:

merge INTO MA_PARTICIPANT P USING 
    (SELECT * from TABLE_TO_CHANGE) TT ON (TT.PART_ID = P.PART_ID) 
WHEN matched THEN 
    UPDATE  
    SET 
    IF P.DEACTIVATED_FLG <> 'Y' THEN 
    P.CUSTOMER_RK = TT.NEW_CUSTOMER_RK, 
    P.DEACTIVATED_FLG = 'Y' 
    ELSE 
    P.CUSTOMER_RK = TT.NEW_CUSTOMER_RK 
+0

Похоже, что вам нужно, где положение в вашем обновление части оператора слияния. Если бы я был вами, я бы сначала написал заявление MERGE и добавил его в вопрос. – Boneist

ответ

0

Это необходимо обновить все соответствующие строки, установив DEACT_FLG в Y и CUSTOMER_RK к NEW_CUSTOMER_RK:

MERGE INTO MA_PARTICIPANT P 
USING TABLE_TO_CHANGE TT 
ON (TT.PART_ID = P.PART_ID) 
WHEN matched THEN 
    UPDATE  
    SET CUSTOMER_RK = NEW_CUSTOMER_RK, 
     DEACT_FLG = 'Y' 
+0

Я должен обновить EACH значение CUSTOMER_RK, которое у меня есть в таблице TABLE_TO_CHANGE, и значения DEACTIVATED_FLG в зависимости от значения в таблице MA_PARTICIPANT - если значение «N», то я обдумаю его для «Y» еще - не обновить. Наконец, каждый CUSTOMER_RK, который я обновляю, должен иметь flg = 'Y' – Jdzel

+0

Если это так, нам не нужны 'IF',' DECODE', ...; в 'MERGE', для каждой сопоставимой строки мы можем обновить' CUSTOMER_RK = NEW_CUSTOMER_RK' и 'DEACT_FLG = 'Y'' – Aleksej