我正在跑步 Oracle数据库10g企业版10.1.0.5.0版 - 产品介绍 我想将m2中的数据合并到m1中。我希望看到3条记录 在合并之后的m1中,一个用于'c',其中knt为4,一个用于'a',其中knt为1 一个为'b',knt为1.
但我得到了一切。好像没有检查更新或插入。
见下文。
致以最诚挚的问候,
菲尔
SQL> desc m1;
Name Null? Type
----------------------------------------- -------- ----------------------------
K VARCHAR2(6)
V VARCHAR2(6)
KNT NUMBER(4)
SQL> desc m2;
Name Null? Type
----------------------------------------- -------- ----------------------------
K VARCHAR2(6)
V VARCHAR2(6)
KNT NUMBER(4)
SQL> select * from m1;
no rows selected
SQL> select * from m2;
K V KNT
------ ------ ----------
a aaa 0
b bbb 0
c ccc 0
c ccc 0
c ccc 0
a aaa 0
b bbb 0
c ccc 0
c ccc 0
SQL> merge into m1 d
2 using (select k,v,knt from m2) s
SQL> desc m1;
Name Null? Type
----------------------------------------- -------- ----------------------------
K VARCHAR2(6)
V VARCHAR2(6)
KNT NUMBER(4)
SQL> desc m2;
Name Null? Type
----------------------------------------- -------- ----------------------------
K VARCHAR2(6)
V VARCHAR2(6)
KNT NUMBER(4)
SQL> select * from m1;
no rows selected
SQL> select * from m2;
K V KNT
------ ------ ----------
a aaa 0
b bbb 0
c ccc 0
c ccc 0
c ccc 0
a aaa 0
b bbb 0
c ccc 0
c ccc 0
SQL> merge into m1 d
2 using (select k,v,knt from m2) s
3 on (d.k = s.k)
4 when matched then
5 update set d.knt = d.knt+1
6 when not matched then
7 insert(d.k,d.v,d.knt)
8 values(s.k,s.v,s.knt)
9 ;
SQL> select * from m1;
K V KNT
------ ------ ----------
b bbb 0
b bbb 0
c ccc 0
c ccc 0
c ccc 0
c ccc 0
c ccc 0
a aaa 0
a aaa 0
答案 0 :(得分:3)
你确定要合并吗?这听起来像你真的想要
INSERT INTO m2( k, v, knt )
SELECT k, v, count(*)
FROM m1
GROUP BY k, v
MERGE是一种基于集合的操作。 M2中的数据在执行查询时进行评估,因此USING
子句不会看到作为MERGE
的一部分插入的行。由于USING
子句返回0行,因此M1
中的所有数据都将插入M2
。 <{1}}子句永远不会被触发。
答案 1 :(得分:1)
叹息。看起来我必须保留我插入“不同”的记录。
所以这很有效。 .... 的种类。
merge into m1 d
using (select distinct k,v,knt from m2) s
on (d.k = s.k and d.v = s.v)
when matched then
update set d.knt = d.knt+1
when not matched then
insert(d.k,d.v,d.knt)
values(s.k,s.v,s.knt)