Bezdepbonusu7Программирование: статьи и ответы

Вопрос

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

Автор вопроса: Phillip NealОтветов: 2

Я использую 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

mergeoracleinsertupsert

Ответы

Ответ 1 · рейтинг 3 · Justin Cave

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

Ответ 2 · рейтинг 1 · Phillip Neal

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

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

 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)

Перевод вопроса и ответов сообщества Stack Overflow, лицензия CC BY-SA. Оригинал на Stack Overflow.

Похожие материалы