首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Oracle MERGE self-join与一列中的更改

Oracle MERGE self-join与一列中的更改
EN

Stack Overflow用户
提问于 2017-06-30 05:06:00
回答 1查看 706关注 0票数 0

我有表TABLE1,其中包含列COL1、COL2、COL3、COL4和COL5

如果我有COL1值作为val1,我想把COL1 =val1的所有匹配行插入到这个表中,这样COL1 = val2

如果从5行where COL1 = val1开始,在合并之后,我又得到了5行where COL1 = val2和所有其他列值都按原样复制。

所以:

1)如果没有COL1 = val2行,则插入发生。2)如果存在COL1 = val2行,则不执行任何操作。

我一直在尝试下面的方法。它在1)中有效,但在2)中有效,但由于基于col1、col2、col4上的索引的唯一性constarint导致重新执行语句无法插入。(rundate是另一个值)

代码语言:javascript
复制
MERGE INTO TABLE1 t1
 USING ( 
          SELECT COL1,COL2COL3,COL4,COL5
          FROM TABLE1
          WHERE COL1 = val2
          AND COL4 <= rundate
          AND ( COL5 IS NULL
                OR COL5 >= rundate)
       ) t2  
 ON (t1.COL1 = t2.COL1)
 WHEN NOT MATCHED THEN
    INSERT (t1.COL1,t1.COL2,t1.COL3,t1.COL4,t1.COL5)
    VALUES (val2,t2.COL2,t2.COL3,t2.COL4,t2.COL5)
  ;
EN

回答 1

Stack Overflow用户

发布于 2017-06-30 05:36:35

根据您的请求,以下是使用MERGE语句完成此操作的一种方法。像Alex Poole一样,我不明白为什么一定要使用MERGE;这是一个简单的INSERT。当您必须根据条件同时更新和插入时,MERGE特别好;当您仅根据条件插入时,一个简单的INSERT语句就足够了。

无论如何:(只使用三列,它的工作方式与五列相同)这适用于val1 =1和val2 =2,它们是硬编码的,但如果需要,您可以将它们更改为绑定变量(或任何其他提供输入的方法)。

代码语言:javascript
复制
create table table1 ( col1 number, col2 number, col3 number );

insert into table1
  select 1, 101, 300 from dual union all
  select 1, 103, 400 from dual union all
  select 1, 130, 533 from dual union all
  select 2, 103, 400 from dual union all
  select 3, 103, 400 from dual
;

commit;

merge into table1 t
  using ( select col2, col3
          from   table1
          where  col1 = 1
        ) q
     on ( t.col1 = 2 and t.col2 = q.col2 and t.col3 = q.col3 )
when not matched then insert (col1, col2, col3) values (2, q.col2, q.col3)
;

select * from table1;

      COL1       COL2       COL3
---------- ---------- ----------
         1        101        300
         1        103        400
         1        130        533
         2        103        400
         3        103        400
         2        130        533
         2        101        300
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/44834992

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档