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