Мой оракул слияние не работает - PullRequest
0 голосов
/ 04 ноября 2011

Я использую Oracle Database 10g Enterprise Edition Release 10.1.0.5.0 - Prod.Я хочу объединить данные из м2 в m1.Я ожидаю увидеть 3 записи в m1 после слияния: одну для 'c' с номером 4, одну для 'a' с номером 1 и одну для 'b' с номером 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

Ответы [ 2 ]

3 голосов
/ 04 ноября 2011

Вы уверены, что хотите MERGE? Похоже, вы действительно хотите

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

MERGE - операция, основанная на множестве. Данные в M2 оцениваются во время выполнения запроса, поэтому ваше предложение USING не будет видеть строки, вставляемые как часть MERGE. Поскольку предложение USING возвращает 0 строк, все данные из M1 будут вставлены в M2. Предложение WHEN MATCHED никогда не будет запущено.

1 голос
/ 07 ноября 2011

Вздох.Похоже, я должен хранить записи, которые я вставляю, «отличными».

Так что это работает..... вид.

 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)
...