Программирование баз данных MS SQL Server (1084479), страница 38
Текст из файла (страница 38)
13 В запросах с конструкцией 0М10)) в отличие от тех запросов, в которых не применяется эта конструкция, по умолчанию принято использование опции 01БТТНСТ, а не АЬЬ. Из-за этого на первых порах при освоении запросов такого типа может возникать значительная путаница. Ведь при выполнении других запросов происходит возврат всех строк, независимо от того, являются ли они дубликатами по отношению к другим строкам или нет, но результаты запросов с конструкцией 0))10М выглядят иначе — если в запросе не используется ключевое слово АЬЬ, то происходит возврат только одной из всех дублирующихся строк. Соединения 155 Рис. 4.1.
Схематическая иллюсюРавил и4юнесса фвРмиРвванил резульюатвв вбзедииеиил Как обычно, рассмотрим несколько примеров использования запросов с конструкцией ПН1ОН. ы ' " "„» ' в Применение запроса с конструкцией ситом Вначале рассмотрим запрос с конструкцией БИ10И, который действительно может найти практическое применение (автор убедился в том, что подобные запросы действительно бывают нужны в реальном мире, хотя и не очень часто). Например, предположим, что приближаются новогодние каникулы и мы хотим отправить открытку и поздравить с Новым годом всех тех, кто имеет отношение к компании 1чоггЬюьпй. Для этого необходимо составить список полных адресов, по которым должны быть отправлены открытки, и включить туда служащих, заказчиков и поставщиков компании.
Такую задачу можно выполнить, воспользовавшись всего лишь одним запросом, подобным приведенному ниже. 156 Глава 4 ОБЕ Могспе1псС ЯЕЬЕСт Соврапуиаве АБ Аппгевв, Сгсу, Ведтоп, Ровса1сос4е, Соппсгу ГВОМ Спвсовегв ОН10н ЯЕЬЕСТ Соврапуиаве, АсЫгевв, Сгсу, Ве91оп, Розса1соое, Соппсгу РВОМ Бпрр1гегв ~Л41 ОН ЯЕЬЕСТ Гтгвсиаве + ' АсЫгевв, Сгсу, Ве91оп, Ровса1сос4е, Соппсгу РВОМ Евр1оуеев лаве, + Ьавсиаве, Этот запрос возвращает только один результирующий набор (табл. 4.13), но в нем содержатся данные из всех трех запросов. Таблица 4.13.
Результаты выполнения оператора соединения Сазу Ведзоп Роеса1сос4е Соипагу А1тгес5в Гпссегх1все ОЬеге Бог. 57 Бег1гп НОЬЬ 12209 Бегвапу Апа тгп7'Шо Еврагеоасов у Ье1ас1ов Мехтсо О.Р. НОЬ1 Мехтсо Аеоа. с1е 1а Сопвстсистоп 2222 5021 Апс5гее Рп11ег 908 Н. Саргса1 Нау Тасова НА 98401 ОБА Нг1вап КаХа Не1втпх1 21240 Гзп1апс Кевьпвхасп 45 Но1вк1 Еа7агс п1. Г11сгоеа 58 Нагвгаеа НОЬЬ 01-012 Ро1апо Еаапве Чегкоор ВТБпеед 22 Еаапоав БпоертаЬг1ех НПЬЬ 9999 ЕЕ Месьег1апов Итак, в этом списке никто не забыт.
Компания А1Егессв — заказчик, Апс)ген Гп13.ег— служащий, а компания Еаапве — поставщик. Соединения 157 Во в)земя отладки этого загфоса авпиф пое)чол довольно несовместимые рвзульпилпы со~. тировки спфок, пагученных гфи выпагнении зап~юса, поэтому не стоит удивляться, если будет пагучена последовательность спфок, значительно отличающаяся от гфиведенной в табл. 4. 13. Однако важнее то, что должно быть получено гфимерно 129 ст)юк ('кагичеспюо строк изменяется в зависимости от того, какие иэменения были внесеньг в базу данных ИохсЬнцпа перед этим).
Если же требуетсгс чтобы ))тульттпы бъсги возвращены в огфеделеннаи по)зядке, то следует применить конст(зук цию ОКОЕМ Е У. В опеРатгфах с консвфукцией 0Н10Н консвфукция 0Я0Ей ВУ должна входить в состав последнего запфоса, на кото)гъгй Расгфосвфаняется опе)гация объединения (0Н10И). Описание полученнык реэультатоа Вместо трех результирующих наборов получен только один. СУБД ЯЯЕ $егчег выполняет все эти три запроса и по существу добавляет результаты, полученные позже, к результатам, сформированным раньше, создавая один объединенный результирующий набор.
Еще раз следует подчеркнуть, что заголовки для возвращаемых столбцов берутся из списка выборки первого запроса. СЕЕАТЕ ТАВЬЕ ПпаопТевх1 Тасо1 со12 СМЕАТЕ ТАВОТЕ ПпэопТевх2 1ооо1 со14 ) 1МЯЕМТ 1МТО ПпъопТевх1 ЧАг ЦЕЯ ) 'ААА') 1МЯЕЕТ 1МТО ПпьопТевх1 ЧАЕПЕ$ и ВВВ ' ) Тпх 1ВЕМТ1ТГ, сваг)3), 1пх 1ВЕМТТТТ, саве(3), Переходя ко второму примеру, автор хочет показать, какие действия осуществляются оператором 0М10М применительно к дублирующимся строкам; по существу при обработке дублирующихся строк происходят действия, обратные по отношению к обычному запросу, поскольку по умолчанию в процессе объединения результирующих наборов дубликаты строк отбрасываются.
(При описании запросов других типов было принято предположение, что необходимо сохранить все строки в результатах, если не задано ключевое слово 01ЕТ?МСТ.) Данный пример вряд ли найдет применение на практике, но он — краткий, может быть легко выполнен, а также позволяет полностью разобраться в том, что происходит. В данном случае создаются две таблицы, из которых должна осуществляться выборка данных. После этого происходит вставка, по три строки в каждую таблицу, причем одна строка повторяется в обеих таблицах.
Если бы в выполняемом запросе было задано ключевое слово АЕЕ, то в результат вошли бы все строки (в данном случае шесть). А если запрос выполняется с ключевым словом 01ЯТ1МСТ, то количество возвращаемых строк должно составлять только пять (поскольку одна дублирующаяся строка отбрасывается): 158 Глава 4 ТИЯЕЕт Ьнтс Ппьоптезгь ЧАЬОЕЯ ('ссс') ЬИЯЕЕт Тнтс Опьсптезгг ЧАЬПЕЯ ('ссс') ТИЯЕат тнтс Спьоптезпг ЧАЬЯЕЯ ('ово ) Ьняяат Тнтс Ппьоптезпг ЧАЬЦЕЯ ('ЕЕЕ') ЯЕЬЕСт соьг ЕВОЕ Ппьоптезгь ПИТОМ ЯЕЬЕСТ со14 ЕЕОМ ОпьспТезп2 ВЕЬИт 'Оьчьг(ег пыле ЯЕЬЕСТ со12 ЕЕОМ Опьсптезгь ПИЬОИ АЬЬ ЯЕЬЕСт ссЬЗ ЕЕОМ ПпьопТезг2 ВЕОГ тАВЬЕ Пптоптезпь ВЕОЕ тАВЬЕ Опьсптезгг Ниже приведена только основная часть полученных результатов (по мере выполнения отдельных операторов происходил возврат сообщений "опе тон(з) аттессес(", но они здесь не показаны, а приведены только данные, позволяющие ознакомиться с интересующими нас результатами запросов).
со12 ооо ЕЕЕ ввв ссс (5 гое(з) аттесгес)) Пьч1г(ег Ььпе — — — — — — — — — — — — —— со12 ввв ссс ссс пво ЕЕЕ (б гоз(з) аттесгес() Первый результирующий набор был получен с помощью обычного оператора ()ихОи без дополнительных параметров. Вполне очевидно, что в нем удалена одна строка, — хотя строка "ССС" была вставлена в обе таблицы, появился только один ее экземпляр, поскольку дублирующиеся строки уничтожаются по умолчанию.
Соединения 159 Второй результирующий набор немного изменился. На этот раз использовалась конструкция ОК10К А1Ь, а ключевое слово АЕЬ гарантирует возврат всех полученных строк. Именно поэтому внезапно появилась дублирующаяся строка, которая была удалена из результатов предыдущего запроса. Резюме В реляционной СУБД данные чаще всего не сосредоточиваются в одной таблице, а распределяются по нескольким таблицам. Конструкции 101Е и ОК10К позволяют комбинировать данные из нескольких таблиц с применением описанных ниже способов. 13 Если требуется исключить из полученных результатов данные, которые не имеют согласующихся полей, то используется конструкция 1ММЕК,101М.
й Если требуется сохранить в составе результатов все данные, поля в которых согласуются, и вместе с тем дополнить их результирующим набором, содержащим полный объем данных, относящихся к одной из сторон соединения, то используется конструкция ООТЕК,101К. Если требуется сохранить в составе результатов все данные, поля в которых согласуются, и вместе с тем дополнить их результирующим набором, содержащим полный объем данных, относящихся к обеим сторонам соединения, то используется конструкция ЕОЬЬ 1010. О Если требуется получить декартово произведение, в состав которого входят записи двух таблиц, то используется конструкция ОКОВЕ 301К.
Как правило, декартовы произведения применяются при формировании входных данных для некоторых сложных функций, а также служат для создания испытательных данных. 11 Если требуется объединить результаты второго запроса с результатами первого запроса, то используется конструкция ОК10К. Синтаксис операторов внутренних и внешних соединений имеет две различные формы. В настоящей главе, кроме стандартного, представлен альтернативный синтаксис, чтобы читатель не испытывал затруднений, сталкиваясь с унаследованным кодом (в котором встречается альтернативный синтаксис).