d580a088

Перемещение данных



Перемещение данных

Помимо команд 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) ;

Записи для людей в таблице EMPLOYEE, которые не соответствуют записям для тех же людей, но уже в таблице BONUS, будут вставлены в таблицу BONUS. Теперь запрос таблицы BONUS дает следующее:

SELECT * FROM BONUS ;
EmployeeName BONUS
---------------- -------
Brynna Jones 100
Chris Bancroft 100
Greg Bosser 100
Kyle Weeks 100
Neth Doze 50
Matt Bak 50
Sam Saylor 50
Nic Foster 50

Первые четыре записи, созданные с помощью команды INSERT, располагаются в алфавитном порядке по именам работников. Остальные записи, добавленные с помощью команды MERGE, располагаются в том порядке, в котором они были в таблице EMPLOYEE.



Содержание раздела