2016-09-29 11 views
0

私はMERGEsubqueryとIDを取得していますが、subquery in the NOT MATCHED statementが常に実行されるかどうかは疑問です。Oracle - Subqueries reduction in Merge

 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'); 

ありがとうございます!

EDIT:私はPreparedStatementJDBCを使用していますので、?です。

+0

を。ここでは疑問に思う。言及した結合が満たされたときに実行する必要があるアクティビティを明示的に拒否しました。 – XING

答えて

1

サブクエリは必要ない、あなたは、単にここでのように、insert部分にpro.idを参照できます。

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