WITH add_row AS
( INSERT INTO aircrafts_tmp
SELECT * FROM aircrafts
RETURNING *
)
INSERT INTO aircrafts_log
SELECT add_row.aircraft_code, add_row.model, add_row.range,
current_timestamp, 'INSERT'
FROM add_row;
INSERT 0 9
Давайте рассмотрим эту команду более подробно. Обратите внимание, что вся «по-
лезная» работа выполняется в рамках конструкции WITH add_row AS (...). Здесь
строки с помощью команды SELECT выбираются из таблицы aircrafts и вставля-
ются в таблицу aircrafts_tmp. При вставке строк, выбранных из одной таблицы,
в другую таблицу необходимо, чтобы число атрибутов и их типы данных во вставляе-
мых строках были согласованы с числом столбцов и их типами данных в целевой таб-
лице. Завершается конструкция WITH add_row AS (...) предложением RETURNING
*, которое просто возвращает внешнему запросу все строки, успешно добавленные
в таблицу aircrafts_tmp. Конечно же, при этом из таблицы aircrafts_tmp добав-
ленные строки никуда не исчезают. Запрос получает имя add_row, на которое может
ссылаться внешний запрос, когда он «хочет» обратиться к строкам, возвращенным
с помощью предложения RETURNING *.
Теперь обратимся к внешнему запросу. В нем также присутствует команда INSERT,
которая получает данные для ввода в таблицу aircrafts_log от запроса SELECT.
Этот запрос, в свою очередь, получает данные от временной таблицы add_row,
указанной в предложении FROM. Поскольку в предложении RETURNING мы указали
в качестве возвращаемого значения *, то будут возвращены все столбцы таблицы
aircrafts_tmp, т. е. той таблицы, в которую строки были вставлены. Следователь-
но, в команде SELECT внешнего запроса можно ссылаться на имена этих столбцов:
SELECT add_row.aircraft_code, add_row.model, add_row.range, ...
213
|