Программирование >>  Программирование баз данных 

1 ... 57 58 59 [ 60 ] 61 62 63 ... 346


Ключевые слова any and some

Операции ANY и SOME являются функциональными эквивалентами, но ключевое слово SOME совместимо со стандартом ANSI, поэтому следует использовать именно его; тем не менее, по причинам, описанным ниже, применение этих операций не рекомендуется. В оставшейся части этого раздела будет использоваться только ключевое слово SOME, но вполне допускается заменять его ключевым словом ANY в любом месте, поскольку это приводит к получению тех же результатов.

Операции ANY и SOME позволяют расширить перечень операций, которые могут применяться к спискам, созданным в подзапросах. Ключевые слова ANY и SOME могут также использоваться в сочетании с любой из операций, которые обычно служат для проведения сравнений (таких как >=,<=,<>, !>итд.).

Если взять в качестве примера операцию >, то операция >SOME позволяет найти значение больше любого отдельного взятого значения, т.е. значение больше минимума. В частности, операция >SOME (1, 2, 3) позволяет найти значение больше 1. А операция SOME, применяемая в сочетании с операцией проверки на равенство (имеюш;ей знак операции =), функционально эквивалентна операции IN.

Фактически автор ие рекомендует чрезмерно увлекаться использованием ключевого слова ANY или SOME. Причина этого состоит в том, что, по мнению автора, с точки зрения выполняемых функций оно является практически бесполезным. Действия, которые могут быть выполнены с помощью операции SOME (или ANY), подразделяются на две категории. К первой из них относятся операции, которые могут быть столь же успешно выполнены с помощью других синтаксических конструкций, как с помощью SOME (причем опыт автора показывает, что использование синтаксических конструкций, отличных от SOME, всегда приводит к уменьшению объема кода). Ко второй категории относится конструкция о SOME. При этом если конструкция NOT IN (А, Б, С) логически эквивалентна выражению <>А AND о В AND о С, то конструкция о SOME эквивалентна выражению <>А OR <> В OR о С. Таким образом, конструкции, подобные о SOME, не только являются бесполезными, но могут даже привести к неправильному толкованию смысла используемых выражений. Достаточно отметить то, что в данном примере применение любой операции сравнения, условием которой является выражение oANY, равносильно выборке без каких-либо условий. Ведь по определению результат выражения <> А OR о В OR о С всегда является истинным.

Иначе говоря, хотя ключевое слово SOME входит в состав применимых средств программирования и никто не вправе запретить его использовать, самому автору до настоящего времени не встретилось ни одного примера оператора с конструкцией SOME, который не мог бы быть реализован более наглядно и с более высокой производительностью на основе другой конструкции (выбор конкретной конструкции зависит от используечого варианта применения ключевого слова SOME, которое бьшо решено заменить).

Операция all

Операция ALL аналогична операциям SOME и ANY в том, что позволяет расширить круг применяемых операций сравнения. Но проведя анализ функций ключевого слова ALL по такому же принципу, как было показано выше на примере применения операции >, можно понять, действительно ли это ключевое слово позволяет достичь каких-либо преимутцеств. Выражение >ALL позволяет найти значение больше всех прочих, т.е. больше максимума. Таким образом, выражение >ALL (1, 2 , 3) означает больше 3.



Связанные подзапросы

Прежде чем прист)Т[ить к изложению темы настоящего раздела, автор хочет высказать настоятельн)то рекомендацию - обратите особое внимание на то, что здесь сказано! Обычно все разработчики обладают каким-то стандартным набором навыков, но тот, кто знает, как действуют связанные подзапросы и как они применяются, имеет в своем распоряжении гораздо более широкие возможности. Говоря о том, насколько важно изучить эту тему, автор стремится также подчеркнуть, что важно понять практическую значимость связанных подзапросов. Связанные подзапросы относятся к категории таких инструментов, с помощью которых можно сделать невозможное возможным.

Более того, с помощью связанных подзапросов часто можно превратить несколько строк кода в одну и добиться соответствующего повышения производительности. Но сложность освоения данной темы обусловлена тем, что вначале требуется овладеть принципиально иным стилем мышления по сравнению с тем, который обычно применяется в программировании. На первый взгляд кажется, что связанные подзапросы относятся к категории наиболее простых в изучении и освоении понятий языка SQL. Но после того как процесс изучения заканчивается, разработчик напрочь о них забывает, причем лишь потому, что сами понятия, лежащие в основе связанных подзапросов, противоречат складу его ума. Если же читатель относится к числу тех немногих счастливцев, которым удается закрепить в памяти принципы действия связанных подзапросов, то он, безусловно, становится также одним из немногих, которые способны решать задачи, которые кажутся не поддающимися решению. А когда придется бороться за каждую миллисекунду, чтобы повысить производительность запросов, то именно вы будете иметь в своем распоряжении гораздо более полный комплект инструментальных средств по сравнению с друтими разработчиками.

Принципы действия связанных подзапросов

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

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

1. Внешний запрос получает строку, которая передается во внутренний запрос.

2. Внутренний запрос выполняется с учетом переданного в него значения (значений).

3. Внутренний запрос передает во внешний запрос значения, сформированные из полученных в нем результатов, а во внешнем запросе эти значения используются для завершения намеченной в нем обработки.



Связанные подзапросы в конструкции where

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

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

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

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

В этом не было бы ничего сложного, если бы допускалось использование двух отдельных запросов, поскольку достаточно было бы создать временную таблицу, а затем выполнить операцию соединения с этой таблицей, как в следующем примере: USE AdventureWorks

SELECT CustomerlD, MIN((OrderDate)) AS OrderDate

INTO #MinOrderDates

FROM Sales.SalesOrderHeader

GROUP BY CustomerlD

ORDER BY CustomerlD

SELECT o.CustomerlD, о.SalesOrderlD, o.OrderDate FROM Sales.SalesOrderHeader о JOIN #MinOrderDates t

ON o.CustomerlD = t.CustomerlD

AND o.OrderDate = t.OrderDate ORDER BY o.CustomerlD

DROP TABLE #MinOrderDates

Выполнение этого запроса приводит к получению примерно 19 134 строк (фактически полученное значение может отличаться в большую или меньшую сторону в зависимости от того, какие дополнительные эксперименты проведены в конкретной базе данных):

(19119 row(s) affected) CustomerlD SalesOrderlD OrderDate

1 43860 2001-08-01 00:00:00.000

2 46976 2002-08-01 00:00:00.000

3 44124 2001-09-01 00:00:00.000

4 46642 2002-07-01 00:00:00.000

29481 45427 2002-02-13 00:00:00.000



1 ... 57 58 59 [ 60 ] 61 62 63 ... 346

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