Глава 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еение запросов