2011-11-04 61 views
0

我正在 Oracle數據庫10g企業版發佈10.1.0.5.0 - PROD。 我想將m2中的數據合併到m1中。我希望看到3個記錄在 M1在合併後,一個用於「C」爲4的可耐特,一個用於「A」爲1 ,一個用於「B」爲1。我的Oracle合併不起作用

一個耐特一個耐特

但我得到了一切。就好像沒有檢查更新或插入發生。

見下文。

最好的問候,

菲爾

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 

回答

3

你確定你要合併?這聽起來像你真的想要

INSERT INTO m2(k, v, knt) 
    SELECT k, v, count(*) 
    FROM m1 
    GROUP BY k, v 

MERGE是一個基於集合的操作。在M2數據在讓你USING子句不會看到正在插入的MERGE的一部分行執行查詢的時間進行評估。由於USING子句返回0行,所有從M1數據將要被插入到M2WHEN MATCHED條款永遠不會被觸發。

+0

啊哈!發佈在[http://stackoverflow.com/questions/2337271/ora-30926-unable-to-get-a-stable-set-of-rows-in-the-source-tables]表明我必須有獨特的要插入的記錄。因此 - 如果我將我的sql更改爲--- arrggh,請參閱我對自己問題的回答 –

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)