ИСПОЛЬЗОВАНИЕ ПОДЗАПРОСОВ СОЗДАНЫХ ВО ВНЕШНЕЙ ТАБЛИЦЕ ЗАПРОСА
Запрещение на ссылку к таблице которая модифицируется командой INSERT не предохранит вас от
использования подзапросов которые ссылаются к таблице используемой в предложении FROM внешней
команды SELECT.
Таблица из которой вы выбираете значения, чтобы произвести их для INSERT, не будет задействована
командой; и вы
сможете ссылаться к этой таблице любым способом которыми вы обычно это делали, но только если
эта таблица указана в
автономном запросе. Предположим что мы имеем таблицу с именем Samecity в которой мы запомним
продавцов с
заказчиками в их городах. Мы можем заполнить таблицу используя соотнесенный подзапрос:
INSERT INTO (Samecity
SELECT * FROM (Salespeople outer WHERE city IN ( SELECT city FROM Customers inner WHERE inner.snum = outer.snum );
Ни
таблица Samecity, ни таблица Продавцов не должны быть использованы во внешних или внутренних
запросах INSERT. В
качестве другого примера, предположим, что вы имеете премию для продавца который имеет самый
большой порядок на
каждый день. Вы следите за ним в таблице с именем Bonus, которая содержит поле snum продавцов,
поле odate и поле amt.
Вы должны заполнить эту таблицу информацией которая хранится в таблице Порядков, используя
следующую команду:
INSERT INTO Bonus SELECT snum, odate, amt FROM Orders a WHERE amt = ( SELECT MAX (amt) FROM Orders b WHERE
a.odate = b.odate );
Даже если эта команда имеет подзапрос который базируется на той же самой таблице что и
внешний
запрос, он не ссылается к таблице Bonus, на которую воздействует команда. Что для нас
абсолютно приемлемо. Логика
запроса, естественно, должна просматривать таблицу Порядков, и находить для каждой строки
максимум порядка сумм
приобретений для этой даты. Если эта величина - такая же как у текущей строки, текущая строка
является наибольшим
порядком для этой даты, и данные вставляются в таблицу Bonus.