Інколи буває потрібно провести відбір рядків в операторі DELETE, опираючись на дані із кілька таблиць.
Наприклад: потрібно вилучити всі замовлення, які прийняв працівник Іванов, причому код цього працівника ми забули.
Для того, щоб вибрати ці замовлення, можна побудувати запит до двох таблиць:
6). Вивести всі замовлення, які прийняв працівник Іванов:
6).а). SELECT Z .*
FROM Zamovlennia Z,
Pracivnyky P
WHERE Z . Prodavec = P. Kod_Pracivn
AND P.Prizv = ‘Іванов’
Цей оператор не можна перетворити у оператор DELETE заміною SELECT Z.* на DELETE, бо оператор DELETE не може звертатися до двох таблиць.
Для того, щоб виконати це завдання, потрібно використовувати умову відбору з підлеглим запитом:
6).б). SELECT *
FROM Zamovlennia
WHERE Prodavec = (SELECT Kod_Pracivn
FROM Pracivnyky
WHERE Prizv = ‘Іванов’)
Тепер – можна замінювати SELECT * на DELETE:
7). Вилучити всі замовлення, які прийняв працівник Іванов.
7). DELETE FROM Zamovlennia
WHERE Prodavec = (SELECT Kod_Pracivn
FROM Pracivnyky
WHERE Prizv = ‘Іванов’)
Підлеглий запит в операторі DELETE можуть мати кілька рівнів вкладеності. Вони також можуть містити зовнішні звертання до цільової таблиці оператора DELETE – тоді секція FROM оператора DELETE відіграє ту саму роль, що і секція FROM оператора SELECT.
Ось приклад запиту на вилучення, в якому потрібно використовувати підлеглий запит, що містить зовнішнє звертання до цільової таблиці:
8). Вилучити дані про клієнтів, які не робили замовлень від 1 січня 2000 р.
8). DELETE FROM Сlienty
WHERE NOT EXISTS
(SELECT *
FROM Zamovlennia
WHERE Client = Kod_Clienta
AND Data_Zamovl > ‘01-JAN-00’)
Цей оператор DELETE виконується таким чином: кожний рядок таблиці Clienty по черзі перевіряється на відповідність умові відбору.
Для кожного клієнта підлеглий запит вибирає всі замовлення, зроблені цим клієнтом після 1 січня 2000р. Звертання до стовпчика Kod_Clientа в підлеглому запиті – це зовнішнє звертання до ідентифікатора клієнта того рядка таблиці Clienty, який перевіряється оператором DELETE в даний момент.
Підлеглий запит в цьому прикладі –це корельованих підлеглий запит.
В підлеглих запитах оператора DELETE зовнішні звертання зустрічаються дуже часто, бо це єдиний спосіб „з’єднання” таблиць підлеглого запиту і цільової таблиці оператора DELETE.
В SQL1 єдине обмеження на застосування підлеглих запитів в операторі DELETE полягає в тому, що цільову таблицю не можна вказувати в секції FROM підлеглого запиту незалежно від рівня вкладеності. Це запобігає звертанню із підлеглих запитів на цільову таблицю (частина рядків якої вже може бути вилучена), за винятком зовнішніх звертань до рядка, який в даний момент перевіряється оператором DELETE.
В стандарті SQL2 це обмеження знімається: вважається, що звертання до цільової таблиці в підлеглому запиті – це звертання до повної цільової таблиці, із якої ще не вилучено жодного рядка.