|
Программирование >> Построение запросов sql
В данном примере связанный подзапрос в условии поиска представляет собой <скалярный подзапрос>. Он возвращает одно единственное значение (количество ремонтных заявок) для текущей строки-кандидата, выбранной из таблицы 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.
Рис. 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.
Рис. 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.
Рис. 3.100. Результат использования предиката ANY В этом примере вложенный запрос выполняется один раз, возвращая все значения поля PaySum, для которых истинно условие PayYear=2001 и GazServiceCD=2 (58.7, 250, 20, 20, 80 ). Затем значения, выбранные
|
© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки. |