|
Программирование >> Sql: полное руководство
WHERE TARGET > (SELECT SUM(QUOTA) FROM SALESREPS WHERE REP OFFICE = OFFICE) CITY Chicago Los Angeles В этом (более типичном) случае результаты подчиненного запроса нельзя вычислить один раз, так как он возвращает различные результаты для каждого конкретного офиса. На рис. 9.2 изображена схема выполнения этого запроса. Главный запрос извлекает данные из таблицы offices, а его предложение where отбирает офисы, которые будут включены в таблицу результатов запроса. Условие, заданное в этом предложении, поочередно применяется ко всем строкам таблицы offices. Предложение where сравнивает значение текущей строки в столбце target со значением, кото{)ое возвращается подчиненным запросом. Для каждой строки результатов главного загфоса вьшолняется свой подчиненный запрос, выдающий сумму плановых объемов продаж для служащих текущего офиса. Результатом подчиненного запроса является одно число, и предложение where сравнивает его со значением столбца target, выбирая или отбрасывая текущий офис на основании результата сравнения. Как видно из рисунка, выполнение подчиненного запроса повторяется для каждой строки, проверяемой предложением where главного запроса. Таблица SALESREPS Подчиненный запрос
SELECT SUM (QUOTA) FROM SALESREPS VjlHERE REP 0FFICE=2 Таблица SALESREPS Подчиненный запрос f SELECT SUM (ОООТАЛ J>7).4-j FROM SALESREPS - ЧСУ yiHERE REp10FFICE=2V Внешние ссылки Часто в теле подчиненного запроса требуется ссылаться на значение столбца в текущей строке главного запроса. Рассмотрим еще раз запрос из предыдущих параграфов: Вывести список офисов, для которых плановый объем продаж превышает сумму плановых объемов продаж всех служащих. SELECT CITY FROM OFFICES WHERE TARGET > (SELECT SOM(QUOTA) FROM SALESREPS WHERE REP OFFICE = OFFICE) В приведенной инструкции select подчиненный запрос играет следующую роль: он вычисляет сумму плановых объемов продаж для служащих, работающих в одном офисе, а именно в том, который в данный момент проверяется предложением where главного запроса Подчиненный запрос выполняет просмотр таблицы salesreps. Но обратите внимание: столбец office в предложении where подчиненного запроса является столбцом не таблицы salesreps, а таблицы offices, которая входит в главный запрос. Во время последовательной проверки строк таблицы offices значение столбца office в текущей строке этой таблицы используется для выполнения подчиненного запроса. Столбец office в подчиненном запросе является примером внешней ссылки. Внешняя ссылка представляет собой имя столбца, не входящего ни в одну из таблиц, перечисленных в предложении from подчиненного запроса, и принадлежащего таблице, указанной в предложении from главного запроса. Как показывает предыдущий пример, значение в столбце внешней ссылки берется из строки, проверяемой в настоящий момент главным запросом. Условия отбора в подчиненном запросе Подчиненный запрос всегда является частью условия отбора в предложении where или having. В главе 6 были рассмотрены простые условия отбора, которые могут использоваться в этих предложениях. Кроме того, в SQL используются следующие условия отбора в подчиненном запросе: Сравнение с результатом подчиненного запроса. Значение выражения сравнивается с одним значением, которое возвращается подчиненным запросом. Эта проверка напоминает простое сравнение. Проверка на принадлежность результатам подчиненного запроса. Значение выражения проверяется на равенство одному из множества значений, которые возвращаются подчиненным запросом. Эта проверка напоминает простую проверку на членство в множестве. Проверка на существование. Проверяется наличие строк в таблице результатов подчиненного запроса. Многократное сравнение. Значение выражения сравнивается с каждым из множества значений, которые возвращаются подчиненным запросом. сравнение с результатом подчиненного запроса (операторы <>, <, >, >-) Как видно из рис. 9.3, сравнение с результатом подчиненного запроса является модифицированной формой простого сравнения. Значение выражения сравнивается со значением, которое возвращается подчиненным запросом, и если условие сравнения выполняется, то проверка дает результат true. Эта проверка используется для сравнения значения из проверяемой строки с одним значением, полученным от подчиненного запроса, как показано в следующем примере: Вывести список служащих, у которых плановый объем продаж равен или больше планового объема продаж офиса, расположенного в Атланте. SELECT NAME FROM SALESREPS WHERE QOOTA >= SELECT TARGET FROM OFFICES WHERE CITY = Atlanta) NAME Bill Adams Sue Smith Larry Fitch проверяемое выражение < <= > >= подчиненный запрос В этом гфимере подчиненный запрос считывает плановый объем продаж для офиса в Атланте. Затем полученное значение используется для отбора тех служащих, у которых плановый объем продаж превышает план этого офиса. В операции сравнения с результатом подчиненного запроса можно использовать те же шесть операторов сравнения (=, о, <, <=, >, >=), что и при простом сравнении. Подчиненный загфос, участвующий в операции сравнения, должен возвращать в качестве результата единичное значение, т.е. одну строку, содержащую один столбец. Если результатом подчиненного запроса являются несколько строк или несколько столбцов, то сравнение не имеет смысла и СУБД вьщает сообщение об ошибке. Если в результате выполнения подчиненного запроса не будет получено ни одной строки или будет получено значение null, то операция сравнения возвращает null.
|
© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки. |