Явные операции соединения стр. 3 |
||
UNION JOINЭтот тип соединения был введен в стандарте SQL-92, но в более поздних версиях стандарта отсутствует. В частности, его уже нет в стандарте SQL2003 (ANSI и ISO). Как и многие другие конструкции языка SQL, соединение UNION JOIN является избыточным, поскольку его можно выразить через разность полного и внутреннего соединений. Формально это можно записать следующим образом:
Ну, а если полное соединение не поддерживается (MySQL), то его можно получить объединением левого и правого внешних соединений. Тогда наша формула примет вид
Давайте в качестве примера, где мог бы пригодиться этот тип соединения, рассмотрим следующую задачу. Найти производителей, которые выпускают принтеры, но не ПК, или выпускают ПК, но не принтеры. Будь у нас возможность использовать UNION JOIN, мы бы решили задачу так:
Воспользуемся формулой. Полное соединение производителей ПК и производителей принтеров даст нам как тех, кто производит что-то одно, так и тех, кто производит и то, и другое.
Теперь вычтем из результата тех, кто производит и то, и другое (внутренее соединение):
Попутно я убрал из этого решения избыточные DISTINCT, поскольку EXCEPT выполнит исключение дубликатов. Это единственный полезный тут урок, т.к. операцию взятия разности (EXCEPT) можно заменить простым предикатом:
Наконец, чтобы представить результат в один столбец, воспользуемся функцией COALESCE:
Разумеется, это не единственный способ решения данной задачи. Он лишь демонстрирует замену репрессированного типа соединений. Мне неизвестны СУБД, в которых было бы реализовано соединение UNION JOIN. |