|
Программирование >> Sql: полное руководство
в приведенном выше примере в предложении where определена одна строка таблицы salesreps, которая будет удалена из этой таблицы. Предложение where имеет знакомый вид - действительно, это то же самое предложение, которое необходимо включить в инструкцию select для выборки из таблицы этой же строки Условия отбора, которые можно задать в предложении where инструкции delete, полностью совпадают с условиями отбора, доступными в одноименном предложении инструкции select и описанными в главах 6 и 9. Вспомним, что в предложении where инструкции select условия отбора могут определять как одну строку, так и набор строк - в зависимости от конкретного условия. То же самое справедливо и для предложения where инструкции delete. Предположим, например, что клиент служащего Якобсена, компания 1п1егСоф (идентификатор клиента 2126), отменила все свои заказы. Вот инструкция delete, удаляющая заказы из таблицы orders: Удалить все заказы компании InierCorp (идентификатор клиента 2126). DELETE FROM ORDERS WHERE CUST = 2126 2 rows deleted. В данном примере предложение where выбирает несколько строк таблицы orders, которые затем удаляются из нее. Все строки таблицы orders последовательно проверяются на соответствие условию отбора. Строки, в которых условие отбора имеет значение true, удаляются, а строки, в которых условие отбора имеет значение false или null, сохраняются. Поскольку инструкция delete этого типа осуществляет в таблице поиск удаляемых строк, ее иногда называют поисковой, в отличие от инструкции delete другого типа, всегда удаляющей одну строку и называемой позиционной. Позиционная инструкция delete применяется только в программном SQL. Ниже приведен ряд дополнительных примеров поисковых инструкций delete: Удалить все заказы, сделанные до 15 ноября 1989 года. DELETE FROM ORDERS WHERE ORDER DATE < IS-NOV-Sg 5 rows deleted. Удалить данные о всех клиентах, обслуживаемых Биллом Адамсом, Мэри Джонс и Дэном Робертсом (идентификаторы служащих 105, 109 и 101). DELETE FROM CUSTOMERS WHERE CDST REP IN (105, 109, 101) 7 rows deleted. Удалить данные о всех служащих, принятых на работу до июля 1988 года и еще не имеющих личного плана. DELETE FROM SALESREPS WHERE HIRE DATE < Ol-JUL-88 AND QUOTA IS NULL 0 rows deleted. Удаление всех строк Хотя предложение where в инструкции delete является необязательным, оно присутствует почти всегда. Если же оно отсутствует, то удаляются все строки целевой таблицы. Например: Удалить все заказы. DELETE FROM ORDERS 30 rows deleted. Хотя в результате вьшолнения приведенной инструкции delete таблица orders становится пустой, из базы данных она не удаляется. Определение таблицы orders и ее столбцов остается в базе данных. Таблица по-прежнему существует, и в нее по-прежнему можно добавлять новые строки с помощью инструкции insert. Чтобы удалить из базы данных определение таблицы, необходимо использовать инструкцию drop table. Такая инструкция delete несет в себе потенциальную угрозу удаления необходимых строк, поэтому всегда следует задавать условие отбора и обращать внимание на то, отбирает ли оно действительно ненужные строки. Желательно вначале проверить предложение where в интерактивном режиме в составе инструкции select и отобразить выбранные строки на экране. Убедившись, что это именно те строки, которые требуется удалить, можно использовать предложение where в инструкции delete. Инструкция DELETE с подчиненным запросом * Инструкции delete с простыми условиями отбора, рассмотренные в предыдущих примерах, отбирают строки для удаления исключительно на основании содержимого этих строк. Но иногда отбор строк необходимо производить, опираясь на данные из других таблиц. Предположим, вы хотите удалить все заказы, принятые служащей Сью Смит. Не зная ее идентификатора, вы не сможете найти ее заказы, пользуясь одной только таблицей orders. Чтобы найти эти заказы, можно было бы воспользоваться запросом к двум табтацам: Найти заказы, принятые Сью Смит. SELECT ORDER NUM, AMOUNT FROM ORDERS, SALESREPS WHERE REP = EMPL NDM AND NAME = Sue Smith
Однако в инструкции delete запрещено использовать объединение таблиц. Инструкция delete с параллельным удалением из двух таблиц является неправильной: DELETE FROM ORDERS, SALESREPS WHERE REP = EMPL NOM AND NAME = Sue Smith Error: More than one table specified m FROM clause Чтобы выполнить поставленную задачу, необходимо использовать условие отбора с подчиненным запросом. Ниже показана правильная инструкция delete, выполняющая поставленную задачу: Удалить все заказы, принятые Сью Смит. DELETE FROM ORDERS WHERE REP = (SELECT EMPL NUM FROM SALESREPS WHERE NAME = Sue Smith) 5 rows deleted. Подчиненный запрос находит идентификатор Сью Смит, а затем предложение where отбирает заказы с данным идентификатором. Как видно из этого примера, подчиненные запросы в инструкции delete играют важную роль, поскольку они позволяют удалять строки, основываясь на информации, содержащейся в других таблицах. Вот еще два примера инструкции delete, в которых используются условия отбора с подчиненным запросом: Удалить данные о всех клиентах, обслуживаемых служащими, у которых фактический объем продаж меньше, чем 80 процентов их плана DELETE FROM CUSTOMERS WHERE CUST REP IN (SELECT EMPL NUM FROM SALESREPS WHERE SALES < (.8 * QUOTA)) 2 rows deleted. Удалить данные о всех служащих, у которых сумма текущих заказов меньше, чем два процента их личного плана. DELETE FROM SALESREPS WHERE (.02 * QUOTA) > (SELECT SUM(AMOUNT) FROM ORDERS WHEFIE REP = EMPL NUM) 2 row deleted. Подчиненные запросы в предложении where могут иметь несколько уровней вложенности. Они могут также содержать внешние ссьипси на целевую таблицу инструкции delete, в этом случае предложение from инструкции delete играет такую же роль, как и предложение from инструкции select. Вот пример запроса на удаление, в котором требуется использовать подчиненный запрос, содержащий внешнюю ссылку: Удалить данные о всех клиентах, которые не делали заказов с 10 ноября 1989 года. DELETE FROM CUSTOMERS WHERE NOT EXISTS (SELECT * FROM ORDERS
|
© 2006 - 2024 pmbk.ru. Генерация страницы: 0.006
При копировании материалов приветствуются ссылки. |