Программирование баз данных MS SQL Server (1084479), страница 68
Текст из файла (страница 68)
Длл данного конкРезаного запйоса кеооходимо использовать клю меое слово 01Я Т1ИСТ. В п~ютивном случае не была бы исключена возможность получения многочисленных стасюк, откоса)Нихсч к каждому заказчику. НапУ)имер, компания Егия С Напбе1 заказывала това)з (гербе-яргеас( дваждьь поэтому было бы пазучено по однт1 ст)зоне длл каждого заказа. А по условиям рассматриваемой задачи необходимо оп[)едезить, какие заказчики заказали и тот, и другт1 товар, а ке количество сделанных ими заказов. Вполне очевидно, что с помощью производных таблиц удалось сформировать запрос, задача составления которого на первый взгляд казалась невозможной, и не только получить нужную информацию, но даже добиться вполне приемлемой производительности.
Но следует учитывать, что производные таблицы не позволяют решать все возможные задачи. Например, если результирующий набор становится довольно большим и количество строк, участвующих в операции соединения, достигает больших величин, то может потребоваться создать временные таблицы и сформировать на них индексы (производные таблицы не имеют индексов). Безусловно, возможность применения тех или других инструментальных средств зависит от ситуации, но, во всяком случае, производные таблицы позволят вам значительно расширить свой арсенал инструментальных средств.
Дополнительные сведения о запросах 267 Операция е~~8~8 ЯЕЬЕСТ Спввоеег1О, Соерапунаее РВОМ Спвсоаегв сп ИНЕВЕ ЕХ1ЯТБ (БЕЬЕСТ Огбегто РВОМ Огбегв о ИНЕВЕ о.спвсоеегтп = сп.спвгоеег1О) Выполнение этого запроса приводит к получению тех же 89 строк. которые были неоднократно получены в различных примерах этой главы: СоярапуИаее Спввожег1О А1тгебв РпввегКЬвсе Апа Тгп1111о Еерагедабов у Ье1абов Апсопто Могепо Таяпегта Агоппб ГЬе Ноге Вегд1ппбв впаЬЬХор В1апег Яее Ое11Аагеввеп АЬРК1 АМАТЕ АВТОИ АРООТ ВЕРЕЯ ВЬАОЯ ИЬЬСе С1огег Магкегв И11еап Ка1а Ио1ват Ба)агб ИН1ТС И1ЬМК ИОЬЗА (Б9 гое(в) аттесвеб) Очевидно, что такую же задачу можно было бы легко решить с помощью соединения: БЕЬЕСт Отзттнст сп.с Г егтп, с .Соерапун е РВОМ Спвсоеегв сп ЮО1И Огбегв о ОИ сп.спвсотег1О = о.спввоеег1Р В частности, применение указанного синтаксиса, основанного на использовании операции соединения, привело бы к получению точно таких же результатов (не считая возможных различий, вызванных другим порядком сортировки).
Поэтому напра- Автор рассматривает ЕХТБТЯ как операцию, но в документации Воо)св ОО11пе для обозначения ЕХТБТБ применяется лишь термин "ключевое слово". По-видимому, применение указанной трактовки обусловлено тем, что ЕХ1ЯТЯ не полностью соответствует определению понятия операции.
Разумеется, ЕХ1ЯТЯ в такой же степени заслуживает названия "операция", как и операция, обозначаемая ключевым словом 1И, но нельзя также отрицать, что обработка данных в ней происходит во многом иначе. При использовании операции ЕХ1ЯТБ возврат данных фактически не происходит. Вместо этого вырабатывается значение ТВЫЕ или РАЬЯЕ, указывающее на то, существуют ли данные, которые соответствуют критериям, заданным в том запросе, на который распространяется действие операции ЕХ1ЯТЯ. Перейдем непосредственно к рассмотрению примера, позволяющего ознакомиться с тем, как применяется эта операция. В данном случае речь идет о таком запросе, с помощью которого формируется список заказчиков, разместивших в компании по мень. шей мере один заказ (общее количество размещенных заказов нас не интересует): 268 Глава 7 ОЯЕ МогСЬв1пе БЕЬЕСТ с.спяеовег1О, Соврапуиаве ГНОМ Спяговегя с ЬЕГТ ОСТЕН д01М Огс(егя о ОМ с.спяговег1О = о.Спясовег1О НБЕНЕ о.Спясовег1О 1Я МСЬЕ Этот запрос возвращает две строки.
А чтобы добиться такого же изменения состава полученных результатов при использовании операции ЕХ1ЯТЯ, достаточно добавить только одно ключевое слово— МОТ: БЕАЕСТ Спясовег1О, Соврапунаве ГНОМ Спясовегя сп МНЕНЕ МОТ ЕХ1БТБ (ЯЕЬЕСТ Огоеггс ГНОМ Огс)егя о МНЕРЕ о.епяговег1О = сп.спясовег1О) Выполнение этого оператора приводит к получению тех же двух строк: Спяговег1О Совряпуиаве Г1ББА Гаьгуса 1пгег.
Яа1сьтсЬая Я.А. Ряг1я яресТа11гея Г1ББА РАН15 (2 гок(я) аггесгес() Различие в производительности в данном случае становится еще более заметным по сравнению с внутренним соединением. Дело в том, что при выполнении оператора с ключевым словом МОТ в СУБД ЯОЕ Яегуег применяется операция отрицания к результатам той же операции ЕХ15Т5. И несмотря на то, что теперь используются не сами полученные результаты, а их отрицание, СУБД ЯОЕ Яегуег по-прежнему шивается резонный вопрос, с чем связана необходимость в использовании этого нового синтаксиса.
Ответ на этот вопрос весьма прост — с потребностями повышения производительности. Если в запросе используется ключевое слово ЕХТБТБ, то СУБД ЯЯЕ Яегуег не приходится выполнять полное построчное соединение. Вместо этого СУБД просматривает строки до тех пор, пока не находит первое соответствие, после чего немедленно останавливается. Дело в том, что операция ЕХ15ТЯ возвращает истинное значение сразу после обнаружения первого соответствия, поэтому необходимость в выполнении дальнейшего просмотра отпадает. Рассмотрим кратко ту же ситуацию под другим углом зрения. Предположим, что необходимо найти с помощью запроса информацию о тех заказчиках, которые не разместили в компании ни одного заказа.
В соответствии с тем методом, который был основан на использовании соединения (см. главу 5), потребовалось бы внести весьма существенные поправки в тот подход, с помощью которого получается требуемый ответ. Прежде всего нужно было бы воспользоваться не внутренним соединением, а внешним, затем применить операцию сравнения, чтобы определить, содержат ли какие-либо строки с данными о заказах АПЛ.)=значения. Таким образом, запрос, основанный на использовании соединения, выглядит следующим образом: Дополнительные сведения о запросах 2б9 прекращает просмотр сразу же после обнаружения одной строки, соответствующей условию.
Единственное различие состоит в том, что условием прекращения просмотра становится возврат нз операции сравнения значения ГАЬБЕ, а не ТЕРЕ. Во всем остальном, кроме производительности, запрос с конструкцией НОТ ЕХ1БТЯ не отличается от запроса с внешним соединением. Другие способы использования конструкции ех~Зт8 Одним из широко применяемых способов использования конструкции ЕХ1БТБ является проверка существования таблицы перед вызовом на выполнение оператора ее создания. На основании результатов такой проверки может быть предусмотрено уничтожение существующей таблицы или внесение изменений в существующую таблицу с помощью оператора АЬТЕЕ либо какого-то другого.
Чаще всего применяется примерно такой способ осуществления указанного действия: 1Р ЕХ1ЯТЯ (ЯЕЬЕСТ * РВОМ яуяпп]еспя ННЕНЕ Ьб = оЬ)есг Ьб(М [бпо).(ЯНТррегя)') АНР ОВЗЕСТРНОРЕНТТ(1б, Н'Тяпяегтяь1е') = 1) РРРР ТАВ1.Е (бпо].[ЯП1ррегя) 60 СНЕАТЕ ТАВЬЕ [бьо).(ЯАТррегя] ( [ЯВЬррег10) (Ьпг) 1РЕМТ1ТУ (1, 1) НОТ МОЬЬ, [Соарапукаае] (пчагсьаг] (40) НОТ НОЬЬ, (Рьопе) (пчагсьаг] (24) МОЬ1. ) 60 Очевидно, что операция ЕХТЯТЯ не должна возвращать какого-либо иного значения, кроме ТЕРЕ нли ГАЬЯЕ, а это означает, что данная операция может стать основой очень удобного условного выражения.
В предыдущем примере было показано, что оператор РАЗОР ТАВ1,Е вызывается на выполнение, только если создаваемая таблица уже существует; в противном случае данная часть сценария исключается и происходит переход непосредственно к оператору СНЕАТЕ. Это позволяет предотвратить возникновение в ходе выполнения сценария следующих двух ошибок.
Во-первых, исключается возможность неудачного завершения попытки выполнения оператора СНЕАТЕ в связи с тем, что создаваемый в нем объект уже существует (а такое неудачное завершение могло бы привести к возникновению других проблем, если операция создания таблицы входит в состав сценария, где должны быть созданы другие таблицы, зависящие от успешно созданной первой таблицы). Во-вторых, неудачно завершилась бы попытка уничтожения таблицы с помощью оператора РРРР, поскольку зта таблица еще не существуег (хотя такая ошибка не приводит к каким-либо неприятным последствиям, кроме выработки сообщения, которое может лишь смутить заказчика, устанавливающего у себя ваш программный продукт).
Таким образом, применение операции ЕХ1ЯТЯ позволяет предотвратить возникновение обеих ошибок. Итак, операция ЕХ1ЯТЯ может успешно применяться для автоматизации многих действия по сопровождению базы данных. В качестве еще одного примера применения указанной операции для данной цели рассмотрим сценарий СЕЕАТЕ, предназначенный для создания такого объекта, о котором часто забывают, разрабатывая средства автоматизации сопровождения, — самой базы данных. В документации этап создания базы данных часто отражается как часть не совсем понятных указаний, в которых содержатся примерно такие фразы, — "создайте базу данных ' хххх ' ".