|
Программирование >> Построение запросов sql
443690 нет ни одной зарегистрированной заявки, поэтому строка, соответствующая данному абоненту, добавляется в таблицу Request. Следует отметить, что если на улице с кодом 7 проживало бы несколько абонентов, не подававших ремонтные заявки, то запрос не выполнился бы из-за повторяющихся вставляемых значений в столбец первичного ключа (RequestCD=25). Для предотвращения такой ситуации следует использовать генераторы последовательностей для получения очередного значения первичного ключа (генераторы будут рассмотрены при изучении процедурного языка). 5.5. Удаление существующих данных Удаление всех данных или отдельных строк из таблицы или представления осуществляется запросом DELETE. Существует два вида этого запроса: простой запрос DELETE и запрос DELETE с подзапросом. Удаление данных с помощью запроса DELETE может быть позиционированным и поисковым (аналогично описанному ранее обновлению данных с помощью запроса UPDATE). 5.5.1. Простой запрос DELETE Простой запрос DELETE позволяет удалить содержимое всех строк указанной таблицы или тех ее строк, которые выделяются условием поиска предложения WHERE , и имеет следующий формат: DELETE FROM {базовая таблица представление} WHERE <условие поиска> WHERE CURRENT OF имя курсора; RETURNING <список столбцов> [INTO <список переменных>]];. С помощью DELETE можно удалять только отдельные строки, а не индивидуальные значения полей, поэтому параметр поля является недоступным. Например, для удаления всего содержимого таблицы Abonent можно выполнить следующий запрос: DELETE FROM Abonent;. Обычно требуется удалить только определенные строки из таблицы или представления. Чтобы определить, какие строки будут удалены, необходимо использовать условие поиска, как это делается для запроса SELECT. Например, чтобы удалить из таблицы Abonent абонента с номером лицевого счета, равным 005488, требуется выполнить следующий запрос: DELETE FROM Abonent WHERE AccountCD = 005488;. Однако соответствующая запись из таблицы Abonent удалена не будет, так как имеются записи для данного абонента в дочерних таблицах (NachislSumma, PaySumma, Request). Можно использовать DELETE с условием поиска, которое затрагивает несколько строк, например следующим образом: DELETE FROM NachislSumma WHERE NachislYear = 1998;. Позиционированные удаления данных, использующие предложение WHERE CURRENT OF имя курсора, будут подробно рассмотрены при изучении процедурного языка SQL. 5.5.2. Запрос DELETE с подзапросом В предложении WHERE запроса DELETE можно использовать вложенные запросы, которые могут быть как простыми, так и коррелированными. Использование подзапросов в DELETE аналогично использованию таковых в SELECT. Рассмотрим два примера использования простого подзапроса в предложении WHERE запроса DELETE. Для удаления ремонтных заявок, исполнителями которых не являются исполнители ремонтных заявок, зарегистрированных 17 декабря 2001 года, необходимо выполнить следующий запрос: DELETE FROM Request WHERE ExecutorCD NOT IN (SELECT ExecutorCD FROM Request A WHERE IncomingDate = 17.12.2001);. Таблица Request после удаления представлена на рис. 5.11.
Рис. 5.11. Таблица Request после удаления Запрос DELETE удаляет все строки со значением поля ExecutorCD, входящим во множество значений, формируемых вложенным запросом. В итоге из таблицы Request будут удалены все строки, в которых значения поля ExecutorCD не равны 1 и 4 (исполнителями ремонтных заявок, зарегистрированных 17 декабря 2001 года, являются исполнители с кодами, равными 1 и 4). Пусть необходимо удалить сведения о ремонтных заявках абонента Мищенко Е.В. Запрос на удаление соответствующих заявок можно записать в следующем виде: DELETE FROM Request WHERE AccountCD IN (SELECT AccountCD FROM Abonent WHERE Fio = МИЩЕНКО Е.В.);. Таблица Request после удаления представлена на рис. 5.12
Рис. 5.12. Таблица Request после удаления ремонтных заявок абонента Мищенко Е. В. Вложенные запросы в предложении WHERE могут иметь несколько уровней вложенности. Они могут также содержать внешние ссылки на целевую таблицу запроса DELETE. При этом единственное ограничение на применение подзапросов заключается в том, что целевую таблицу нельзя указывать в предложении FROM вложенного запроса независимо от уровня вложенности. Это предотвращает ссылки из вложенных запросов на целевую таблицу (часть строк которой может быть удалена), за исключением внешних ссылок на строку, проверяемую в данный момент на соответствие условию поиска запроса DELETE. Рассмотрим использование коррелированного подзапроса в предложении WHERE запроса DELETE, т.е. подзапроса, который содержит внешнюю ссылку на текущую строку таблицы, из которой удаляются данные. Например, для удаления всех сведений об оплате услуг газоснабжения абонентами, проживающими на улице Татарской, можно использовать следующий запрос: DELETE FROM PaySumma P WHERE EXISTS (SELECT * FROM Abonent A, Street S WHERE S.StreetNM = ТАТАРСКАЯ УЛИЦА AND A.StreetCD = S. StreetCD AND P.AccountCD = A. AccountCD);.
|
© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки. |