Конструкция merge в Oracle

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

Синтаксис

  1. MERGE INTO TABLE_NAME
  2. USING table_reference ON (condition) WHEN MATCHED
  3. THEN UPDATE SET column1 = value1 [, column2 = value2 ...] WHEN NOT MATCHED
  4. THEN INSERT (column1 [, column2 ...]) VALUES (value1 [, value2 ...) ;
  5.  

Разберем работу на примере

  1. -- удаляем таблички
  2. drop table person;
  3. drop table person1;
  4.  
  5. -- создаем и заполняем person
  6. create table person(tabn number primary key, name varchar2(#cc66cc;">10), age number);
  7. insert into person values (#cc66cc;">10 , 'Таня', #cc66cc;">22); -- табельный номер , имя , возраст
  8. insert into person values (#cc66cc;">11 , 'Саша', #cc66cc;">9 );
  9. insert into person values (#cc66cc;">12 , 'Вася', #cc66cc;">30);
  10. insert into person values (#cc66cc;">13 , 'Дима', #cc66cc;">39);
  11. insert into person values (#cc66cc;">14 , 'Олег', #cc66cc;">51);
  12. insert into person values (#cc66cc;">15 , 'Витя', #cc66cc;">55);
  13. insert into person values (#cc66cc;">16 , 'Лена', #cc66cc;">67);
  14. insert into person values (#cc66cc;">17 , 'Маня', #cc66cc;">44);
  15. insert into person values (#cc66cc;">18 , 'Даша', #cc66cc;">12);
  16. insert into person values (#cc66cc;">19 , 'Маша', #cc66cc;">24);
  17. insert into person values (#cc66cc;">20 , 'Миша', #cc66cc;">10);
  18. insert into person values (#cc66cc;">21 , 'Миша', #cc66cc;">42);
  19.  
  20. -- создаем person1 на основе person
  21. create table Person1 #b1b100;">as select * from Person;
  22.  
  23. -- изменяем данные в person
  24. UPDATE person SET age = #cc66cc;">55 where tabn in (#cc66cc;">10,#cc66cc;">11,#cc66cc;">12,#cc66cc;">13,#cc66cc;">14,#cc66cc;">15);
  25. delete person where tabn in (#cc66cc;">15,#cc66cc;">18,#cc66cc;">20);
  26. UPDATE person SET age = #cc66cc;">55 where tabn in (#cc66cc;">10,#cc66cc;">11,#cc66cc;">12,#cc66cc;">13,#cc66cc;">14,#cc66cc;">15);
  27.  
  28. -- сливаем таблицы
  29. MERGE INTO person p
  30. USING ( SELECT tabn, name, age FROM person1) p1
  31. ON (p.tabn = p1.tabn)
  32. WHEN MATCHED THEN UPDATE SET p.age = p1.age
  33. DELETE WHERE (p.tabn = #cc66cc;">10)
  34. WHEN NOT MATCHED THEN INSERT (p.tabn, p.name, p.age)
  35. VALUES (p1.tabn, p1.name, p1.age);
  36.  
  37. -- в person получаем исходные данные, кроме tabn = #cc66cc;">10 его удалили
  38. select * from person1 p1 left join person p on p.tabn = p1.tabn;
  39.  
Источники
http://www.sql.ru/blogs/oracleandsql/1927 http://docs.oracle.com/cd/B19306_01/server.102/b14200/statements_9016.htm
09:02
6.92K
Нет комментариев. Ваш будет первым!
Используя этот сайт, вы соглашаетесь с тем, что мы используем файлы cookie.