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

1 ... 45 46 47 [ 48 ] 49 50 51 ... 101


В данном примере связанный подзапрос в условии поиска представляет собой <скалярный подзапрос>. Он возвращает одно единственное значение (количество ремонтных заявок) для текущей строки-кандидата, выбранной из таблицы Executor. Если это значение больше или равно 4, то текущая строка-кандидат выбирается для вывода из основного запроса. Эта процедура повторяется, пока каждая строка таблицы Executor не будет проверена.

В SQL имеется возможность использовать соотнесенный вложенный запрос, основанный на той же самой таблице, что и основной запрос. Это позволяет использовать соотнесенные вложенные запросы для извлечения сложных форм производной информации. Например, вывести размеры начислений, превышающие среднее значение начислений для каждого абонента, можно с помощью следующего запроса: SELECT F.NachislSum,

(SELECT AVG(D.NachislSum)

FROM NachislSumma D

WHERE F.AccountCD = D.AccountCD) AS AVG D,

A.AccountCD, A.Fio FROM Abonent A, NachislSumma F WHERE F.NachislSum >

(SELECT AVG(S.NachislSum)

FROM NachislSumma S

WHERE F.AccountCD = S.AccountCD) AND A.AccountCD = F.AccountCD ORDER BY 3;.

Результат выполнения запроса представлен на рис. 3.98.

NACHISLSUM

AVG D

ACCOUNTCD

58,70

55,70

005488

АКСЕНОВ С.А.

56,00

55,70

005488

АКСЕНОВ С.А.

62,13

55,70

005488

АКСЕНОВ С.А.

38,32

28,32

015527

КОНЮХОВ В.С.

80,00

42,81

080047

ШУБИНА Т.П.

80,00

42,81

080047

ШУБИНА Т.П.

57,10

55,32

080270

ТИМОШКИНА Н.Г.

58,10

55,32

080270

ТИМОШКИНА Н.Г.

60,10

55,32

080270

ТИМОШКИНА Н.Г.

56,00

22,93

080613

ЛУКАТИНА РМ

250,00

93,49

115705

МИЩЕНКО Е.В.

250,00

93,49

115705

МИЩЕНКО Е.В.

25,30

20,30

126112

МАРКОВА В.П.

56,00

28,15

136160

ШМАКОВ С.В.

58,70

32,13

136169

ДЕНИСОВА Е.К.

80,00

48,77

443069

СТАРОДУБЦЕВ Е.В.

21,67

19,73

443690

ТУЛУПОВА М.И.

Рис. 3.98. Результат использования одной и той же таблицы



В этом примере производится одновременная оценка среднего значения для всех строк, удовлетворяющих условию поиска в предложении WHERE вложенного связанного запроса, одной и той же таблицы со значениями строки-кандидата. Выбирается первая строка-кандидат из таблицы NachislSumma и сохраняется под псевдонимом F. Выполняется вложенный запрос, просматривающий ту же самую таблицу NachislSumma с самого начала, чтобы найти все строки, где значение поля S.AccountCD - такое же, как значение F.AccountCD. Затем по всем таким строкам в таблице NachislSumma вложенный запрос (<скалярный подзапрос>) подсчитывает среднее значение поля NachislSum. Анализируется условие поиска основного запроса, чтобы проверить, превышает ли значение поля NachislSum из текущей строки-кандидата среднее значение, вычисленное вложенным запросом. Если это так, то текущая строка-кандидат выбирается для вывода. Таким образом, производятся одновременно и вычисление среднего, и отбор строк, удовлетворяющих условию.

Примечание. Запрос, использующий агрегатную функцию в условии поиска основного запроса (данная функция является возвращаемым элементом вложенного запроса), нельзя сформулировать с помощью техники соединения таблиц.

Рассмотрим использование соотнесенного вложенного запроса в условии поиска предложения HAVING.

Условие поиска предложения HAVING в подзапросе оценивается для каждой группы из внешнего запроса, а не для каждой строки. Следовательно, вложенный запрос будет выполняться один раз для каждой группы, выведенной из внешнего запроса, а не для каждой строки (как это было при использовании в предложении WHERE).

Например, чтобы подсчитать общие суммы начислений за услуги газоснабжения для абонентов, чьи фамилии начинаются с буквы C, можно использовать следующий соотнесенный вложенный запрос: SELECT N.AccountCD, SUM(N.NachislSum)

FROM NachislSumma N

GROUP BY N.AccountCD

HAVING N.AccountCD =

(SELECT A.AccountCD FROM Abonent A WHERE A.AccountCD = N.AccountCD AND A.Fio LIKE C%);.

Результат выполнения запроса представлен на рис. 3.99.

ACCOUNTCD

136159

16,60

443069

195,10

Рис. 3.99. Результат использования соотнесенного подзапроса в предложении

HAVING



Этот запрос выполняется следующим образом. Основной запрос один раз группирует таблицу NachislSumma по полю AccountCD. Затем для каждой группы выполняется связанный вложенный запрос, возвращая единственное значение поля AccountCD таблицы Abonent (т.к. поле AccountCD содержит уникальные значения).

3.3.2.4. Предикаты ANY и ALL

Операции сравнения можно расширить до многократного сравнения с использованием предикатов ANY и ALL. Это расширение используется при сравнении значения определенного столбца со значениями, возвращаемыми вложенным запросом (вложенный запрос представляет собой <подзапрос столбца>).

Предикат ANY, указанный после знака любой из операций сравнения, означает, что будет возвращено TRUE, если хотя бы для одного значения из подзапроса результат сравнения истинен.

Предикат ALL требует, чтобы результат сравнения был бы истинен для всех значений, возвращаемых подзапросом.

Рассмотрим использование предиката ANY.

Например, требуется вывести информацию об оплатах абонентами за услугу газоснабжения с кодом, равным 2, за период до 2001 года, которые превышают хотя бы одну из сумм, оплаченных за эту же услугу за 2001 год. Запрос будет выглядеть следующим образом:

SELECT *

FROM PaySumma

WHERE PaySum > ANY (SELECT PaySum

FROM PaySumma WHERE PayYear=2001 AND

GazServiceCD=2)

AND PayYear<2001 AND GazServiceCD=2;.

Результат выполнения запроса представлен на рис. 3.100.

PAYFACTCD

ACCOUNTCD

GAZSERVICECD

PAYSUM

PAYDATE

PAYMONTH

PAYYEAR

005488

46,00

06.01.2001

2000

005488

56,00

06.05.1999

1999

115705

40,00

10.02.2000

2000

136160

56,00

12.02.1999

1999

080047

80,00

26.11.1998

1998

115705

250,00

06.10.2000

2000

Рис. 3.100. Результат использования предиката ANY

В этом примере вложенный запрос выполняется один раз, возвращая все значения поля PaySum, для которых истинно условие PayYear=2001 и GazServiceCD=2 (58.7, 250, 20, 20, 80 ). Затем значения, выбранные



1 ... 45 46 47 [ 48 ] 49 50 51 ... 101

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