1

selectを使用して、テーブルにマージされるエントリの一部をフィルタリングすることは可能ですか?

MERGE INTO (
  SELECT * FROM P4PCA2_PIVOT_CA
  WHERE ( CA_LIG_VTE_NUM_ID_PDT <> 0 )
)  ta
USING P4DAS2_DONARTSTK tb ON (tb.NUM_ID_PDT =ta.CA_LIG_VTE_NUM_ID_PDT)    
WHEN MATCHED THEN
  UPDATE SET ta.COD_SECVTE_REVENT=tb.COD_SECVTE_REVENT);
4

3 に答える 3

5

Oracleでは、(一部の)ビューまたはサブクエリでDMLを実行できます。ガイドラインは、Oracleがビューから物理行を取得できる場合、ビューは更新可能であるということです。

したがって、サブクエリでMERGEを使用できます。場合によっては意味があります。たとえば、ステータス列のあるテーブルがあるとします。新しい情報をこのテーブルにマージしますが、を含む行のみを変更しますSTATUS='active'。あなたは書くことができます:

MERGE INTO (SELECT * FROM mytable WHERE status='active') old
     USING (SELECT * FROM newtable) new
        ON (new.id = old.id)
      WHEN MATCHED THEN UPDATE SET old.data1=new.data1;

編集

これにより、ORA-009039iR2が生成されるようです。ただし、11gで動作します。テストスクリプト:

create table t (id number, c varchar2(10));
insert into t (select rownum, 'aaa' from dual connect by level <= 1000);
merge into (select * from t where id <= 10) t 
     using (select 1 id from dual) d 
        ON (t.id = d.id) 
      when matched then update set c = 'iii';
于 2012-06-01T09:38:57.503 に答える
0

何かのようなもの:

MERGE INTO P4PCA2_PIVOT_CA ta
USING (
  select tb.*
  from P4DAS2_DONARTSTK tb
    join P4PCA2_PIVOT_CA ta on tb.NUM_ID_PDT = ta.CA_LIG_VTE_NUM_ID_PDT
  where ta.CA_LIG_VTE_NUM_ID_PDT <> 0 
) t ON (t.NUM_ID_PDT =ta.CA_LIG_VTE_NUM_ID_PDT)    
WHEN MATCHED THEN 
  update set ta.COD_SECVTE_REVENT=tb.COD_SECVTE_REVENT;

USINGあなたの例に基づいて、パーツの結合が正しいかどうかわかりません。

基本的な考え方は、INTO句の一部としてではなく、USING句内で更新する行のみを選択することです。

于 2012-06-01T09:33:18.160 に答える
0

11g未満のバージョンのハックタスティックな回避策:

変数値を保持するパッケージを作成します。

CREATE PACKAGE PKG_MY_VARIABLES 
as
  CA_LIG_VTE_NUM_ID_PDT number;
end;
/

そのパッケージを参照するビューを作成します。

create or replace view V_P4PCA2_PIVOT_CA
as 
select * 
  from P4PCA2_PIVOT_CA 
 where CA_LIG_VTE_NUM_ID_PDT <> PKG_MY_VARIABLES.CA_LIG_VTE_NUM_ID_PDT ;

マージステートメントを実行する前に、パッケージ変数を必要な値に設定します。

exec pkg_my_variables.CA_LIG_VTE_NUM_ID_PDT := 0;

ビューに対してマージを実行します。

MERGE INTO V_P4PCA2_PIVOT_CA ta
USING P4DAS2_DONARTSTK tb ON (tb.NUM_ID_PDT =ta.CA_LIG_VTE_NUM_ID_PDT)    
WHEN MATCHED THEN
  UPDATE SET ta.COD_SECVTE_REVENT=tb.COD_SECVTE_REVENT);
于 2012-10-15T18:45:50.693 に答える