Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Скачиваний:
39
Добавлен:
17.04.2018
Размер:
329.22 Кб
Скачать

Подзапросы, возвращающие более одного столбца

Все подзапросы, рассмотренные до сих пор, извлекали только один столбец данных. Однако они могут возвращать и несколько столбцов. Эту возможность демонстрирует приведенный ниже код, который анализирует названия товаров и даты покупок из таблицы PURCHASE, чтобы вернуть записи только о самых последних покупках каждого товара:

SELECT * FROM purchase

WHERE (product_name, purchase_date)

IN (SELECT product_name, MAX(purchase_date)

FROM purchase

GROUP BY product_name

) ;

4.3. Перенос данных между таблицами

Копирование записей из одной таблицы в другую важно уметь делать по целому ряду причин:

• импорт данных из унаследованной системы. Типичной задачей, возникающей при работе с SQL, является перенос данных из существующей системы в новую. Иногда существующая система просто заменяется новой. В других случаях нужно отображать и переносить в свою систему данные, полученные из внешнего источника. Зачастую исходные данные должны модифицироваться до занесения в новые таблицы, что может потребовать использования таких функций, как UPPER, LOWER, LTRIM, RTRIM, SUBSTR, INSTR, TO_CHAR и DECODE;

• загрузка итоговых значений в хранилище данных. Основной функцией хранилища данных (data warehouse) является хранение предварительно полученных ответов на часто задаваемые вопросы — имеются в виду те вопросы, на которые можно ответить с помощью функций SUM, COUNT, AVG, MIN и МАХ в сочетании с предложениями GROUP BY. Ответы обычно хранятся в отдельном наборе таблиц, которые заполняются путем выполнения SQL-запросов;

• копирование реляционных данных в плоские файлы для ускорения доступа. Реляционные базы данных обеспечивают наиболее эффективное хранение информации, но ее извлечение из реляционных таблиц может занимать довольно много времени, поскольку таблицы требуется соединять. В некоторых приложениях имеет смысл скопировать реляционные данные из многих таблиц в одну таблицу плоского файла, где все соединения уже выполнены. Таблица плоского файла занимает больше места, чем исходные реляционные таблицы, но доступ к ней может осуществляться быстрее, поскольку отпадает необходимость в соединениях.

Перенос данных с помощью оператора insert

Популярным способом переноса данных является использование команды INSERT с подзапросом, извлекающим вставляемые данные из другой таблицы. Для демонстрации этого приема можно создать таблицу командой

CREATE TABLE purchase_log (

purchase_date DATE,

product_name VARCHAR2(25),

product_price NUMBER(4,2),

quantity NUMBER(4,2),

sales_first_name VARCHAR2(15),

sales_last_name VARCHAR2(20)

)

;

Таблица PURCHASE_LOG — это "плоское" представление наиболее важной информации о каждой покупке: даты продажи, названия, цены и количества купленного товара, а также полного имени продавца. Подобная таблица хорошо подходит для получения ответов на вопросы типа: "Кто продал наибольшее и наименьшее количество Red Snaphoo?" Помещение в одну таблицу всей информации, необходимой для ответа на такие вопросы, позволяет получать ответы быстрее и гарантирует, что обращение к исходным таблицам не будет замедляться запросами от людей, которым нужно анализировать содержищиеся в этих таблицах данные.

Теперь, когда есть таблица плоского файла для хранения записей, подлежащих анализу, можно заполнить ее данными. Это будет сделано при помощи команды INSERT, соединяющей записи из таблиц PERSON, PRODUCT и PURCHASE. Ее синтаксис выглядит следующим образом:

INSERT INТО имя_таблицы (

оператор SELECT

) ;

Оператор SELECT — это любая команда SELECT, которая выдает нужные данные со структурой, соответствующей структуре таблицы назначения. Ниже приведен пример использования этого синтаксиса:

INSERT INTO purchase_log (

SELECT purc.purchase_date,

prod.product_name,

prod.product_price,

purc.quantity,

pers.first_name,

pers.last_name

FROM product prod,

person pers,

purchase purc

WHERE prod.product_name = purc.product_name

AND

pers.person_code = purc.salesperson

)

;

Таблица PURCHASE_LOG содержит удобные для анализа наборы данных о каждой продаже из таблицы PURCHASE.

Следует отметить, что в стандарте языка SQL предусмотрен многострочный оператор INSERT, выполняющий те же действия, но синтаксис которого отличается от приведенного выше отсутствием круглых скобок.

Соседние файлы в папке лекции оракл