Oracle — сокращение подзапросов при слиянии

#sql #oracle #merge #oracle11gr2

#sql #Oracle #слияние #oracle11gr2

Вопрос:

У меня есть a MERGE с a subquery для получения и идентификатора, и мне интересно subquery in the NOT MATCHED statement , всегда ли выполняется или нет.

         MERGE INTO CAR_STOCK st
        USING CAR_PRODUCTO pro
        ON (pro.id = st.producto_id AND pro.ean = ?)
        WHEN MATCHED THEN
        UPDATE SET st.stockActual = ?
        WHEN NOT MATCHED THEN
        INSERT (stockActual, local_id, producto_id, activo)
        VALUES (?, ?, (SELECT id FROM car_producto WHERE ean = ?), 'S');
  

Спасибо!

РЕДАКТИРОВАТЬ: ? это потому, что я использую JDBC в PreparedStatement .

Комментарии:

1. Он будет выполняться, если не соответствует. В чем здесь сомнения. Вы явно игнорировали действие, которое необходимо выполнить, когда упомянутые вами соединения удовлетворяют.

Ответ №1:

Нет необходимости в подзапросе, вы могли бы просто сослаться pro.id на insert частично, как здесь:

 merge into t1 using t2 on (t1.a = t2.a)
  when matched then update set t1.b = t2.b
  when not matched then insert (a, b)
  values (0, t2.b)
  

Тестовые данные и merge результат:

 create table t1 as (select 1 a, 'a01' b from dual);
create table t2 as (select 1 a, 'a05' b from dual union all select 2 a, 'bxx' b from dual );

     A  B
------  ---
     1  a05
     0  bxx