Манипуляции данными из базы
Перемещение данных
Помимо команд INSERT и UPDATE, можно воспользоваться командой MERGE (слияние), чтобы добавить данные в таблицу или представление. Команда MERGE позволяет производить "слияние" данных исходных таблиц, представления – в нужные таблицы или сами представления. Эта же команда позволяет вставить новые строки в нужную таблицу или обновить существующие строки. Таким образом, команда MERGE представляет собой весьма удобный способ копирования уже существующих данных из одного местоположения в новое, необходимое пользователю.
Возьмем, к примеру, базу данных VetLab (см. главу 5). Предположим, что некоторые работники, занесенные в таблицу EMPLOYEE, – это продавцы, которые уже приняли заказы, а другие – это работники, не связанные напрямую с продажами, или продавцы, которые еще не взяли заказы. Только что закончившийся год был прибыльным, поэтому вы решили дать премии по 100 долларов каждому, кто принял по крайней мере один заказ, и по 50 долларов всем остальным. Для начала давайте создадим таблицу BONUS (бонус) и вставим в нее записи для каждого работника, который появляется хотя бы однажды в таблице ORDERS, задавая каждой записи значение премии по умолчанию 100 долларов.
Затем воспользуемся командой MERGE, чтобы вставить новые записи для тех работников, которые не имеют заказов, давая им премии 50 долларов. Ниже приведен программный код, который позволяет создать и заполнить таблицу BONUS.
СREARE TABLE BONUS ( | ||
EmployeeName | CHARACTER (30) | PRIMARY KEY |
Bonus | NUMERIC | DEFAULT 100); |
INSERT INTO BONUS (EmployeeName) (SELECT EmployeeName FROM EMPLOYEE, ORDERS WHERE EMPLOYEE.EmployeeName = ORDERS.Salesperson GROUP BY EMPLOYEE.EmployeeName);
Теперь сделаем запрос для таблицы BONUS и посмотрим, что она содержит.
SELECT * FROM BONUS; | |
EmployeeName | BONUS |
---------------- | ------- |
Brynna Jones | 100 |
Chris Bancroft | 100 |
Greg Bosser | 100 |
Kyle Weeks | 100 |
Затем выполним команду MERGE, чтобы назначить премии по 50 долларов для всех остальных работников.
MERGE INTO BONUS USING EMPLOYEE ON (BONUS.EmployeeName = EMPLOYEE.EmployeeName) WHEN NOT MATCHED THEN INSERT (BONUS.EmployeeName, BONUS,bonus) VALUES (EMPLOYEE.EmployeeName, 50);