Конструкция MERGE, вставка - обновление

добавлено: 17 апр 15
понравилось:0
просмотров: 80261
комментов: 2

теги:

Автор: Myp3_u_K

Чалышев Максим Михайлович
Учебный тренинг. SQL от новичка до профессионала.
Бесплатные авторские видеокурсы SQL, PLSQL, JAVA

Моя книга, электронная версия бесплатно
Oracle SQL. 100 шагов от новичка до профессионала. 20 дней новых знаний и практики или платная печатная версия

Назначение
Позволяет дополнять и обновлять данные одной таблицы - данными другой таблицы. При слиянии таблиц проверяется условие, и если оно истинно, то выполняется Update, а если нет - Insert. Причем нельзя изменять поля таблицы в секции Update, по которым идет связывание двух таблиц.

Является командой DML!

Синтаксис
MERGE INTO TABLE_NAME 
USING table_reference ON (condition) WHEN MATCHED 
THEN UPDATE SET column1 = value1 [, column2 = value2 ...] WHEN NOT MATCHED 
THEN INSERT (column1 [, column2 ...]) VALUES (value1 [, value2 ...) ;


Разберем работу оператора MERGE на примере
create table person(tabn number primary key, name varchar2(10), age number);
insert into person values (10 , 'Таня', 22); -- табельный номер , имя , возраст
insert into person values (11 , 'Саша', 9 );
insert into person values (12 , 'Вася', 30);
insert into person values (13 , 'Дима', 39);
insert into person values (14 , 'Олег', 51);
insert into person values (15 , 'Витя', 55);
insert into person values (16 , 'Лена', 67);
insert into person values (17 , 'Маня', 44);
insert into person values (18 , 'Даша', 12);
insert into person values (19 , 'Маша', 24);
insert into person values (20 , 'Миша', 10);
insert into person values (21 , 'Миша', 42)

создадим таблицу person1

create table Person1 as select * from Person;

на основании Person

обновим часть записей в Person и удалим часть из них для актуальности примера

UPDATE person SET age = 55 where tabn in (10,11,12,13,14,15);


delete person where tabn in (15,18,20);
UPDATE person SET age = 55 where tabn in (10,11,12,13,14,15);


Выполним команду MERGE
MERGE INTO person p
   USING (   SELECT tabn, name, age FROM person1) p1
   ON (p.tabn = p1.tabn)
   WHEN MATCHED THEN UPDATE SET p.age = p1.age     
   WHEN NOT MATCHED THEN INSERT (p.tabn, p.name, p.age)
    VALUES (p1.tabn, p1.name, p1.age)

записи в Person будут обновлены и дополнены записями из Person1

Комментарии


  • 19 декабря 2017, 12:27 Колян Козлов

    так работает:



    create table person(tabn int primary key, name varchar(10), age int);
    insert into person values (10 , 'Таня', 22); -- табельный номер , имя , возраст
    insert into person values (11 , 'Саша', 9 );
    insert into person values (12 , 'Вася', 30);
    insert into person values (13 , 'Дима', 39);
    insert into person values (14 , 'Олег', 51);
    insert into person values (15 , 'Витя', 55);
    insert into person values (16 , 'Лена', 67);
    insert into person values (17 , 'Маня', 44);
    insert into person values (18 , 'Даша', 12);
    insert into person values (19 , 'Маша', 24);
    insert into person values (20 , 'Миша', 10);
    insert into person values (21 , 'Миша', 42);

    select * INTO Person1 from Person;

    select * from Person;
    select * from Person1;


    delete person where tabn in (15,18,20);
    UPDATE person SET age = 555 where tabn in (10,11,12,13,14,15);



    MERGE person p
    USING (SELECT tabn, name, age FROM person1) p1
    ON (p.tabn = p1.tabn)
    WHEN MATCHED THEN UPDATE SET p.age = p1.age
    WHEN NOT MATCHED THEN INSERT (tabn, name, age)
    VALUES (p1.tabn, p1.name, p1.age);

  • 01 октября 2018, 17:22 Джонни Кейдж

    Есть еще одна опция:
    WHEN NOT MATCHED BY SOURCE THEN ...



Необходимо войти на сайт, чтобы оставлять комментарии