Программирование >>  Построение запросов sql 

1 ... 64 65 66 [ 67 ] 68 69 70 ... 101


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.

REQUESTCD

ACCOUNTCD

EXECUTORCD

FAILURECD

INCOMINGDATE

EXECUTIONDATE

EXECUTED

005488

17.12.2001

20.12.2001

015527

28.02.1998

08.03.1998

080270

31.12.2001

<null>

080613

16.06.2001

24.06.2001

136160

12.01.1999

12.01.1999

005488

04.04.1999

13.04.1999

115705

20.09.2000

23.09.2000

115705

15.08.2001

06.09.2001

080270

17.12.2001

27.12.2001

443069

13.09.2001

14.09.2001

136160

18.05.2001

25.05.2001

Рис. 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

REQUESTCD

ACCOUNTCD

EXECUTORCD

FAILURECD

INCOMINGDATE

EXECUTIONDATE

EXECUTED

005488

17.12.2001

20.12.2001

015527

28.02.1998

08.03.1998

080270

31.12.2001

<null>

080613

16.06.2001

24.06.2001

080047

20.10.1998

24.10.1998

136169

06.11.2001

08.11.2001

136159

01.04.2001

03.04.2001

136160

12.01.1999

12.01.1999

443069

08.08.2001

10.08.2001

005488

04.09.2000

05.12.2000

005488

04.04.1999

13.04.1999

080270

17.12.2001

27.12.2001

080047

11.10.2001

11.10.2001

443069

13.09.2001

14.09.2001

136160

18.05.2001

25.05.2001

136169

07.05.2001

08.05.2001

Рис. 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);.



1 ... 64 65 66 [ 67 ] 68 69 70 ... 101

© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки.
Яндекс.Метрика