Объединение основанное на равенстве
Объединение, основанное на равенстве
Объединение, основанное на равенстве, — это простое объединение с предложением WHERE, в котором находится условие, определяющее, что значение из одного столбца первой таблицы должно быть равно значению из соответствующего столбца второй таблицы. Если применить такое объединение к таблицам, имеющимся в примере из предыдущего раздела, то можно получить намного более содержательный результат:
SELECT *
FROM EMPLOYEE, COMPENSATION
WHERE EMPLOYEE.EmpID = COMPENSATION.Employ ;
И вот что вышло:
EmpID | FName | LName | City | Phone | Employ | Salary | Bonus |
--------- | --------- | -------- | ------ | -------- | --------- | -------- | -------- |
1 | Whitey | Ford | Orange | 555-1001 | 1 | 33000 | 10000 |
2 | Don | Larson | Newark | 555-3221 | 2 | 18000 | 2000 |
3 | Sal | Maglie | Nutley | 555-6905 | 3 | 24000 | 5000 |
4 | Bob | Turley | Passaic | 555-8908 | 4 | 22000 | 7000 |
В этой таблице зарплаты и премии, расположенные справа, прилагаются к данным о сотрудниках, находящимся слева. Впрочем, лишние данные есть и в этой таблице, так как столбец EmpID повторяет столбец Employ. Исправить этот недостаток можно, сформулировав запрос немного по-другому:
SELECT EMPLOYEE.*, COMPENSATION.SALARY, COMPENSATION.Bonus
FROM EMPLOYEE, COMPENSATION
WHERE EMPLOYEE.EmpID = COMPENSATION.Employ ;
В результате получилось следующее:
EmpID | FName | LName | City | Phone | Salary | Bonus |
--------- | --------- | -------- | ------ | -------- | -------- | -------- |
1 | Whitey | Ford | Orange | 555-1001 | 33000 | 10000 |
2 | Don | Larson | Newark | 555-3221 | 18000 | 2000 |
3 | Sal | Maglie | Nutley | 555-6905 | 24000 | 5000 |
4 | Bob | Turley | Passaic | 555-8908 | 22000 | 7000 |
Эта таблица сообщает вам то, что вы хотите знать, при этом не "нагружая" вас никакими лишними данными. Впрочем, писать сам запрос было несколько утомительно. Чтобы избежать двусмысленности, в именах столбцов приходилось явно указывать имена таблиц. Единственная выгода от этого — тренировка пальцев.
Можно облегчить труд по вводу кода SQL, если использовать псевдонимы (или имена корреляции). Псевдоним — это другое, более короткое имя таблицы. Если переделать предыдущий запрос с помощью псевдонимов, то получится примерно следующее:
SELECT Е.*, С.Salary, С.Bonus
FROM EMPLOYEE E, COMPENSATION С
WHERE E.EmpID = С.Employ ;
В этом примере Е — это псевдоним для EMPLOYEE, а С — для COMPENSATION. Действие псевдонима ограничено только тем оператором, в котором он определен. После объявления псевдонима в предложении FROM его необходимо использовать в пределах оператора. При этом нельзя одновременно использовать и длинную форму имени таблицы, и псевдоним.
Смешение полных имен с псевдонимами приводит к путанице. Проанализируйте следующий пример:
SELECT T1.C, T2.С
FROM Т1 Т2, Т2 Т1
WHERE T1.C > Т2.С ;
В этом примере псевдонимом для Т1 является Т2, а для Т2 — Т1. Конечно, такой выбор неразумен, однако формально он не противоречит никаким правилам. Если допустить возможность совместного использования полных имен и псевдонимов, невозможно определить, о какой таблице идет речь.
Предыдущий пример с псевдонимами эквивалентен следующему оператору SELECT без них:
SELECT T2.C, T1.C
FROM T1, T2
WHERE T2.С > T1.C ;
Стандарт SQL:2003 позволяет объединять больше двух таблиц. Их максимальное количество зависит от конкретной реализации. Синтаксис, используемый при таких объединениях, аналогичен тому, который применяется в случае двух таблиц:
SELECT Е.*, С.Salary, С.Bonus, Y.TotalSales
FROM EMPLOYEE E, COMPENSATION C, YTD_SALES Y
WHERE E.EmpID = С Employ
AND C.Employ = Y.EmpNo ;
Этот оператор проводит с тремя таблицами объединение, основанное на равенстве. При выполнении этого оператора извлекаются данные, хранящиеся в соответствующих столбцах каждой из таблиц. Это делается для того, чтобы можно было получить таблицу, в которой будут имена и фамилии продавцов, число проведенных каждым из них продаж и полученная ими компенсация. Менеджер по продажам сможет быстро увидеть, заслужил ли продавец свое вознаграждение.
Совет 2
Совет 2
Если данные о продажах, проведенных продавцами за последние 12 месяцев до текущей даты, будут храниться в отдельной таблице YTD_SALES (продажи за предшествующий год), то производительность и надежность будут выше, чем при хранении этих данных в таблице EMPLOYEE. Данные в EMPLOYEE относительно стабильные. Имя и фамилия человека, его адрес и номер телефона меняются не слишком часто. А данные о продажах за год меняются, наоборот, достаточно часто. Так как в таблице YTD_SALES столбцов меньше, чем в EMPLOYEE, то таблица YTD_SALES, скорее всего, сможет обновляться быстрее. И если при обновлении итогов продаж можно не трогать таблицу EMPLOYEE, то уменьшается риск случайного изменения хранящихся в ней данных.