|
Программирование >> Sql: полное руководство
Если операция сравнения дает результат true для каждого значения в столбце, то проверка all возвращает значение true. Условие сравнения выполняется для каждого значения, возвращенного подчиненным запросом. Если операция сравнения дает результат false для какого-нибудь значения в столбце, то проверка all возвращает значение false. В этом случае можно утверждать, что условие сравнения выполняется не для каждого значения, возвращенного подчиненным запросом. Если операция сравнения не дает результат false ни для одного значения в столбце, но для одного или нескольких значений дает результат null, то проверка all возвращает значение null. В этой ситуации нельзя с определенностью утверждать, для всех ли значений, возвращенных подчиненным запросом, справедливо условие сравнения; может быть, для всех, а может и нет - все зависит от настоящих значений неизвестных данных. Ощибки, которые могут случиться, если проверка any содержит оператор сравнения не равно (о), происходят и в проверке all. Проверку all, так же как и проверку any, всегда можно преобразовать в эквивалентную проверку на существование (exists), перенеся операцию сравнения в подчиненный запрос. Подчиненные запросы и объединения При чтении данной главы вы, возможно, заметили, что многие запросы, записанные с применением подчиненных запросов, можно также представить в виде многотабличных запросов. Такое случается довольно часто, и SQL позволяет записать запрос любым способом, что иллюстрирует следующий пример: Вывести имена и данные о возрасте служащих, работающих в офисах западного региона. SELECT NAME, AGE FROM SALESREPS WHERE REP OFFICE IN (SELECT OFFICE FROM OFFICES WHERE REGION = Western) NAME AGE Sue Smith 48 Larry Fitch 62 Nancy Angellx 4 9 Эта форма запроса очень близка к его словесной формулировке. Подчиненный запрос возвращает список офисов западного региона, а главный запрос находит служащих, работающих в этих офисах. Вот альтернативная форма данного запроса, использующая объединение двух таблиц: Вывести имена и данные о возрасте служащих, работающих в офисах западного региона. SELECT NAME, AGE FROM SALESREPS, OFFICES WHERE REP OFFICE = OFFICE AND REGION = Western NAME AGE Sue Smith 4 8 Larry Fitch 62 Nancy Angelli 4 9 Данная форма запроса объединяет таблицы salesreps и offices, чтобы найти регион, в котором работает каждый служащий, а затем исключает тех служащих, которые не работают в западном регионе. Каждый из двух приведенных запросов находит соответствующих служащих, и ни один из них не является ни единственно правильным , ни оишбочным . Для большинства людей первый вариант (с использованием подчиненного запроса) покажется более естественным, так как в словесном запросе не требуется никакой информации об офисах, и необходимость объединения таблиц salesreps и offices для ответа на запрос кажется немного странной. Конечно, если запрос измеипь так, чтобы в нем запрашивалась информация из таблицы offices, то вариант с подчиненным запросом больше не годится и необходимо использовать запрос к двум таблицам- Вывести имена и данные о возрасте служащих, работающих в западном регионе, а также названия городов, в которых они работают . С другой стороны, имеется много запросов с подчиненными запросами, которые нельзя выразить в виде эквивгЬтентного объединения. Вот простой пример- Вывести имена и данные о возрасте служащих, для которых плановый объем продаж выше среднего. SELECT NAME, AGE FROM SALESREPS WHERE QUOTA > (SELECT AVG(QUOTA) FROM SALESREPS) NAME AGE Bill Adams 37 Sue Smith 4 8 Larry Fitch 62 В данном случае внутренний запрос является итоговым, а внешний - нет, поэтому из этих двух запросов нельзя создать объединение. Уровни вложенности запросов Все рассмотренные до сих пор запросы были двухуровневыми и состояли из главного и подчиненного запросов. Точно так же, как внутри главного запроса может находиться подчиненный запрос, внутри подчиненного запроса может находиться еще один подчиненный запрос, называемый в таком случае вложенным. Вот пример трехуровневого запроса: Вывести список клиентов, закрепленных за служащими, работающими в офисах восточного региона. SELECT COMPANY FROM COSTOMERS WHERE COST REP IN (SELECT EMPL NOM FROM SALESREPS WHERE REP OFFICE IN (SELECT OFFICE FROM OFFICES WHERE REGION = Eastern)) COMPANY AAA Investments Acme Mfg. Chen Associates First Corp. Holm S Landis Ian 5r Schmidt JCP Inc. J.P, Sinclair В данном примере самый внутренний подчиненный запрос SELECT OFFICE FROM OFFICES WHERE REGION = Eastern возвращает столбец данных, содержащий идентификаторы офисов восточного региона. Следующий подчиненный запрос SELECT EMPL NUM FROM SALESREPS WHERE REP OFFICE IN (подчиненный запрос) возвращает столбец данных, содержащий идентификаторы служащих, работающих в одном из выбранных офисов. И наконец, внещний запрос SELECT COMPANY FROM CUSTOMERS WHERE CUST REP IN ( юдчиненный запрос) находит клиентов, закрепленных за выбранными служащими. По такой же методике можно создавать запросы с четьфьмя и более уровнями вложенности. Стандарт ANSI/ISO не определяет максимальное число уровней вло-. женности, но на гфактике с ростом их числа очень быстро увеличивается время выполнения запроса. Когда запрос имеет более двух уровней вложенности, он становится трудным для чтения и понимания. Во многих СУБД количество уровней вложенности запросов ограничено относительно небольщим числом.
|
© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки. |