Мое слияние с оракулом не работает

Я использую Oracle Database 10g Enterprise Edition Release 10.1.0.5.0 - Prod. Я хочу объединить данные из 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

person Phillip Neal    schedule 04.11.2011    source источник


Ответы (2)


Вы уверены, что хотите 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 никогда не сработает.

person Justin Cave    schedule 04.11.2011
comment
Ага!!! Сообщение в заголовке [stackoverflow.com/questions/2337271/ указывает, что для вставки нужны разные записи. Таким образом, если я изменю свой sql на --- arrggh, увижу мой ответ на мой собственный вопрос - person Phillip Neal; 07.11.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)
person Phillip Neal    schedule 07.11.2011