Материал: Graber_Martin_-_SQL_dlya_prostykh_smertnykh_-_2014

Внимание! Если размещение файла нарушает Ваши авторские права, то обязательно сообщите нам

Глава 9. Операция соедииения, операнды которой представлены одной таблицей

Некоторые более сложные операции соединения

В запросе можно использовать любое количество алиасов для единственной табли­ цы, хотя применение более двух в одном предложении SELECT нетипично. Предполо­ жим, продавцам (salespeople) еще не назначили покупателей (customers). Политика кампании состоит в том, чтобы назначить всем продавцам по три покупателя, каждо­ му из которых приписывается одно из трех возможных значений рейтинга. Небходимо

решить, как осуществить такое распределение, и использовать следующие запросы

для просмотра всех возможных комбинаций назначаемых покупателей (выходные данные представлены на рис. 9.3):

SELECT a.cnum, b.cnum, c.cnum

FROM Customers а, Customers Ь, Customres с WHERE a.rating = 100

AND b.rating = 200 AND с. rating = 300;

Этот запрос находит все возможные комбинации покупателей (customers) с тремя значениями рейтинга таким образом, что в первом столбце расположены покупатели с рейтингом 100, во втором столбце - покупатели с рейтингом 200, в третьем столбце - покупатели с рейтингом 300. Они повторены во всех возможных комбинациях. Это сво­ его рода группирование данных, которое нельзя выполнить средствами GROUP ВУ или ORDER ВУ, поскольку они сравнивают значения только из одного столбца.

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

Рис. 9.3. Комбинирование покупателей с различными значениями рейтинга

88

Как выполняется операция соединения двух копий одиой таблицы

продавец (salesperson) Serres (snum 1002) (выходные данные представлены на

рис. 9.4):

SELECT b.cnum, b.cnam

FROM Customers а, Customers Ь WHERE a.snum = 1002

AND b.city = a.city;

Алиас а сделает предикат ложным, за исключением случаев, когда значение столб­ ца snum равно 1002. Так алиас исключает всех покупателей, кроме покупателей про­ давца Serres. Алиас Ь принимает значение "истина" для всех строк с тем же значением города (city), что и текущее значение города (city) в а; в процессе выполнения запроса строка с алиасом Ь делает предикат истинным всякий раз, когда в поле city этой строки представлено то же значение, что и в поле city строки с алиасом а. Поиск строк алиаса

Ьвыполняется исключительно для сравнения значений с алиасом а, из строк с алиасом

Ьникакого реального выбора данных не выполняется. Покупатели (customers) продав­ ца Serres расположены в одном и том же городе, значит выбор их из алиаса а не явля­ ется необходимым. Итак, алиас а локализует строки покупателей (customers) Serres, Liu и Grass. Алиас Ь находит всех покупателей (customers), расположенных в одном из

городов (San Jose и Berlin соответственно), включая, конечно, самих Liu и Grass. Можно конструировать соединения (joins), которые содержат различные таблицы и

алиасы единственной таблицы. Следующий запрос соединяет таблицу Customers с ее копией для нахождения всех пар покупателей, обслуживаемых одним и тем же продав­ цом. В любой момент времени он соединяет покупателя (customer) с таблицей Salespeople для того, чтобы определить имя продавца (salesperson) (выходные данные для запроса представлены на рис. 9.5):

Рис. 9.4. Поиск покупателей, расположенных в тех городах, где действует продавец Serres

89

Глава 9. Операция соединения, операнды которой представлены одной таблицей

Рис. 9.5. Соединение таблицы с ее копией и с другой таблицей

SELECT sname, Salespeople.snum, first.cname, second.cname

FROM Customers first, Customers second, Salespeople

WHERE first.snum = second.snum

AND Salespeople.snum = first.snum

AND first.cnum < second.cnum;

Итоги

Вы узнали, что такое операции соединения Uoins), как их применять для конструи­ рования связей внутри одной таблицы, различных таблиц или двух одинаковых таб­ лиц, где эти возможности могут оказаться полезными. Теперь вам знакомы термины - диапазон переменных, переменные связи, алиасы (в различных программ­ ных продуктах и у разных авторов изложения материала по SQL терминология варьи­ руется, поэтому здесь объяснены все три термина). Вы больше знаете о том, как в действительности работают запросы.

Следующий шаг после комбинации в запросе множества таблиц или множества ко­ пий единственной таблицы состоит в таком объединении множества запросов, при ко­ тором один запрос генерирует выходные данные, управляющие работой другого запроса. Подробнее об этой эффективной операции SQL мы поговорим в 1О и после­

дующих главах.

90

Работаем на SQL

1.Запишите запрос, который позволяет получить все пары продавцов (Salespeople),

проживающих в одном городе. Из результата необходимо исключить комбина­

ции Salespeople с их копиями и повторяющиеся строки, отличающиеся порядком

следования.

2.Запишите запрос, который генерирует все пары номеров для данного покупате­

ля, имена покупателей и исключает повторяющиеся значения, как определено в

пункте!.

3.Запишите запрос, который позволяет получить имена и города для всех покупа­ телей (customers), с тем же рейтингом, что и у Hoffman. Запишите запрос, исполь­ зующий значение поля cnum вместо rating так, чтобы можно было использовать этот вариант запроса даже в случае изменения значения поля rating.

(Ответы см. в 11риложении А.)

91

10

Вло31еение запросов

Источник: https://studfile.net/preview/16418473/