Еще больше комплексных объединений

Вы можете использовать любое число псевдонимов для одной таблицы в запросе, хотя Использование более двух в данном предложении SELECT * будет излишеством. Предположим, что вы еще не назначили ваших заказчиков к вашему продавцу. Компаниия должна назначить каждому продавцу первоначально трех заказчиков, по одному для каждого рейтингового значения. Вы лично можете решить, какого заказчика какому продавцу назначить, но следующий запрос вы используете, чтобы увидеть все возможные комбинации заказчиков, которых вы можете назначать. ( Вывод показывается в Рисунке 9.3 ):
SELECT a.cnum, b.cnum, c.cnum FROM Customers a, Customers b, Customers c WHERE a.rating = 100 AND b.rating = 200 AND c.rating = 300;

SQL Execution Log

AND c.rating = 300;

cnum
cnum
cnum

2001
2002
2004

2001
2002
2008

2001
2003
2004

2001
2003
2008

2006
2002
2004

2006
2002
2008

2006
2003
2004

2006
2003
2008

2007
2002
2004

2007
2002
2008

2007
2003
2004

2007
2003
2008

Рисунок 9.3 Комбинация Пользователей с различными значениями рейтинга
Как вы можете видеть, этот запрос находит все комбинации заказчиков с трем значениями оценки, поэтому первый столбец состоит из заказчиков с оценкой 100, второй с 200, и последний с оценкой 300. Они повторяются во всех возможных комбинациях. Это сортировка группировки которая не может быть выполнена с GROUP BY или ORDER BY, поскольку они сравнивают значения только в одном столбце вывода. Вы должны также понимать, что не всегда обязательно использовать каждый псевдоним или таблицу, которые упомянуты в предложении FROM запроса, в предложении SELECT. Иногда, предложение или таблица становятся запрашиваемыми исключительно потому, что они могут вызываться в предикате запроса. Например, следующий запрос находит всех заказчиков размещенных в городах где продавец Serres ( snum 1002 ) имеет заказчиков ( вывод показывается в Рисунке 9.4 ):
SELECT b.cnum, b.cname FROM Customers a, Customers b WHERE a.snum = 1002 AND b.city = a.city;

SQL Execution Log

SELECT b.cnum, b.cname FROM Customers a, Customers b
WHERE a.snum = 1002 AND b.city = a.city;

cnum
cname

2003
Liu

2008
Cisneros

2004
Grass

Рисунок 9.4 Нахождение заказчиков в городах относящихся к Serres.
Псевдоним a будет делать предикат неверным, за исключением случая когда его значение столбца snum = 1002. Таким образом, псевдоним опускает все, кроме заказчиков продавца Serres. Псевдоним b будет верным для всех строк с тем же самым значением города, что и текущее значение города для a; в ходе запроса, строка псевдонима b будет верна один раз, когда значение города представлено в a. Нахождение этих строк псевдонима b — единственная цель псевдонима a, поэтому мы не выбираем все столбцы подряд. Как вы можете видеть, собственные заказчики Serres выбираются при нахождении их в том же самом городе что и он сам, поэтому выбор их из псевдонима a необязателен. Короче говоря, псевдоним находит строки заказчиков Serres, Liu и Grass. Псевдоним b находит всех заказчиков размещенных в любом из их городов ( San Jose и Berlin соответственно ) включая, конечно, самих — Liu и Grass.
Вы можете также создать объединение которое включает и различные таблицы и псевдонимы одиночной таблицы. Следующий запрос объединяет таблицу Пользователей с собой: чтобы найти все пары заказчиков обслуживаемых одним продавцом. В то же самое врем, этот запрос объединяет заказчика с таблицей Продавцов с именем этого продавца ( вывод показан на Рисунке 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;

SQL Execution Log

SELECT cname, 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;

cname
snum
cname
cname

Serres
1002
Liu
Grass

Peel
1001
Hoffman
Clemens

Рисунок 9.5: Объединение таблицы с собой и с другой таблицей

‹ Больше псевдонимов
Вверх
Резюме 9 ›

Оцените статью
Айтистанция
Добавить комментарий

Adblock
detector