Программирование >>  Sql: полное руководство 

1 ... 63 64 65 [ 66 ] 67 68 69 ... 264


Если операция сравнения дает результат 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 не определяет максимальное число уровней вло-. женности, но на гфактике с ростом их числа очень быстро увеличивается время выполнения запроса. Когда запрос имеет более двух уровней вложенности, он становится трудным для чтения и понимания. Во многих СУБД количество уровней вложенности запросов ограничено относительно небольщим числом.



1 ... 63 64 65 [ 66 ] 67 68 69 ... 264

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