INNER JOIN
всегда можно переписать как неявное соединение.
OUTER JOIN
иногда может быть переписан с помощью строки проприетарных предложений (+)
в Oracle
, *
в SQL Server
и т. Д., Но не всегда.
Кроме того, OUTER JOIN
можно переписать с помощью UNION ALL
и подзапросов:
SELECT *
FROM a
FULL JOIN
b
ON some_condition(a, b)
совпадает с
SELECT *
FROM a, b
WHERE some_condition(a, b)
UNION ALL
SELECT a.*, NULL, NULL, …, NULL
FROM a
WHERE NOT EXISTS
(
SELECT NULL
FROM b
WHERE some_condition(a, b)
)
UNION ALL
SELECT NULL, NULL, …, NULL, b.*
FROM b
WHERE NOT EXISTS
(
SELECT NULL
FROM a
WHERE some_condition(a, b)
)
Раньше это был обходной путь для Oracle
и PostgreSQL
, который не поддерживал синтаксис ANSI
в более ранних версиях, а также обходной путь для MySQL
, который не поддерживает FULL JOIN
Вы должны использовать синтаксис ANSI
OUTER JOIN
, если ваша база данных поддерживает его.