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-00903在 9iR2 中产生。不过它适用于 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

11g 以下版本的 hacktastic 解决方法:

创建一个包来保存变量值:

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 回答
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根据您的示例,不确定我是否正确地加入了该部分。

基本思想是仅在 USING 子句中选择要更新的行,而不是作为 INTO 子句的一部分。

于 2012-06-01T09:33:18.160 回答