Реляционные операторы
Обе формулировки дают одинаковый результат, показанный в табл. 10.7.
Таблица 10.7. Результаты внутреннего объединения.
Е.EmpID | E.Name | P.EmpID | ProjectName | S.EmpID | S.Skill |
---|---|---|---|---|---|
1 | Ferguson | 1 | X-63 Structure | 1 | Mechanical Design |
1 | Ferguson | 1 | X-63 Structure | 1 | Aerodynamic Loading |
1 | Ferguson | 1 | X-64 Structure | 1 | Mechanical Design |
1 | Ferguson | 1 | X-64 Structure | 1 | Aerodynamic Loading |
2 | Frost | 2 | X-63 Guidance | 2 | Analog Design |
2 | Frost | 2 | X-63 Guidance | 2 | Gyroscope Design |
2 | Frost | 2 | X-64 Guidance | 2 | Analog Design |
2 | Frost | 2 | X-64 Guidance | 2 | Gyroscope Design |
3 | Toyon | 3 | X-63 Telemetry | 3 | Digital Design |
3 | Toyon | 3 | X-63 Telemetry | 3 | R/F Design |
3 | Toyon | 3 | X-64 Telemetry | 3 | Digital Design |
3 | Toyon | 3 | X-64 Telemetry | 3 | R/F Design |
Такое расположение данных не отличается слишком большой ясностью. В каждой строке идентификатор сотрудника появляется три раза, а для каждого сотрудника его проекты и виды квалификации указываются несколько раз. Для ответа на возникшие у вас вопросы внутреннее произведение подходит недостаточно хорошо. Более подходящий результат можно получить, используя объединение-слияние с несколькими операторами SELECT. Начнем с простого объединения-слияния:
SELECT * FROM EMPLOYEE E UNION JOIN PROJECTS P UNION JOIN SKILLS S;
Обратите внимание, что в объединении-слиянии нет предложения ON. Дело в том, что сейчас данные не фильтруются, поэтому предложение ON не нужно. Результат, полученный при выполнении этого оператора, приведен в табл. 10.8.
Таблица 10.8. Результат операции union join.
E.EmpID | E.Name | P.EmpID | ProjectName | S.EmpID | S.Skill |
---|---|---|---|---|---|
1 | Ferguson | NULL | NULL | NULL | NULL |
NULL | NULL | 1 | X-63 Structure | NULL | NULL |
NULL | NULL | 1 | X-64 Structure | NULL | NULL |
NULL | NULL | NULL | NULL | 1 | Mechanical Design |
NULL | NULL | NULL | NULL | 1 | Aerodynamic Loading |
2 | Frost | NULL | NULL | NULL | NULL |
NULL | NULL | 2 | X-63 Guidance | NULL | NULL |
NULL | NULL | 2 | X-64 Guidance | NULL | NULL |
NULL | NULL | NULL | NULL | 2 | Analog Design |
NULL | NULL | NULL | NULL | 2 | Gyroscope Design |
3 | Toyon | NULL | NULL | NULL | NULL |
NULL | NULL | 3 | X-63 Telemetry | NULL | NULL |
NULL | NULL | 3 | X-64 Telemetry | NULL | NULL |
NULL | NULL | NULL | NULL | 3 | Digital Design |
NULL | NULL | NULL | NULL | 3 | R/F Design |
Каждая таблица была расширена справа или слева неопределенными (NULL) значениями, после чего проведено объединение в одну таблицу всех строк, получившихся в результате этого расширения. Порядок этих строк произвольный и зависит от используемой реализации. Теперь можно представить полученные данные в более "удобоваримой" форме.