3.2.2.    Использование подзапросов с DELETE

Пусть филиал университета в Нью-Васюках ликвидирован и требуется удалить из таблицы STUDENT записи о студентах, которые там учились. Эту операцию можно выполнить с по­мощью запроса

DELETE

FROM STUDENT

WHERE UNIV_ID IN

(SELECT UNIV_ID FROMUNIVERSITY WHERE CITY =   'Вио-Баскки' ) ;

В предикате предложения FROM (подзапроса) нельзя ссы­латься на таблицу, из которой осуществляется удаление. Однако можно ссылаться на текущую строку из таблицы, являющуюся кандидатом на удаление, то есть на строку, которая в настоящее время проверяется в основном предикате.

DELETE FROM STUDENT WHERE EXISTS (SELECT *

FROM UNIVERSITY

WHERE RATING = 401

3. Манипупирование данными

AND STUDENT. UMIV_ID = UNIVERSITY. UNIV_ID| ;

Часть AND предиката внутреннего запроса ссылается на таб­лицу STUDENT. Команда удаляет данные о студентах, которые учатся в университетах, имеющих рейтинг, равный 401. Сущес­твуют и другие способы решения этой задачи.

DELETE

FROM STUDENT WHERE 401 Ш

(SELECT RATING FROM UNIVERSITY

WHERE STUDENT. UNIV_ID = UNIVERSITY. UNIV_ID) ;

Пусть нужно найти наименьшее значение оценки, полу­ченной в каждый день сдачи экзаменов, и удалить из таблицы сведения о студенте, который получил эту оценку. Запрос бу­дет иметь вид:

DELETE

FROM STUDENT

WHERE STUDENT_ID IN

(SELECT STUDENT_ID FROM EXAM_MARKS A WHERE MARK=

(SELECT MIN (MARK) FROM EXAM_MARKS В

WHERE A. EXAM_DATE = В. EXAMJDATE) ) ;

Так как столбец STUDENT_ID является первичным ключом, то удаляется единственная строка.

Если в какой-то день сдавался только один экзамен (то есть получена только одна минимальная оценка) и по какой-либо причине запись, в которой находится эта оценка, требуется ос­тавить, то решение будет иметь вид:

DELETE

FROM STUDENT

WHERE S TUDENT_ID IN

(SELECT STUDENT_ID FROM EXAM_MARKS A WHERE MARK =

(SELECT MIN(MARK) FROM EXAM_MARKS В

WHERE A.EXAM_DATE = B.EXAM_DATE AND 1 <

(SELECT COONT(SUBJ_ID) FROM EXAM_MARKS В

WHERE A. EXAM_DATE = B.EXAM_DATE)) ) ;