Почему MySQL сообщает о синтаксической ошибке в FULL OUTER JOIN?
SELECT airline, airports.icao_code, continent, country, province, city, website
FROM airlines
FULL OUTER JOIN airports ON airlines.iaco_code = airports.iaco_code
FULL OUTER JOIN cities ON airports.city_id = cities.city_id
FULL OUTER JOIN provinces ON cities.province_id = provinces.province_id
FULL OUTER JOIN countries ON cities.country_id = countries.country_id
FULL OUTER JOIN continents ON countries.continent_id = continents.continent_id
В нем говорится, что
У вас есть ошибка в синтаксисе SQL; проверьте руководство, соответствующее версии вашего сервера MySQL, для правильного синтаксиса для использования рядом с 'external join airports
на авиалиниях .iaco_code = airport.iaco_code полное внешнее соединение 'в строке 4
Синтаксис выглядит правильно для меня. Я никогда не делал много соединений раньше, но мне нужны эти столбцы в таблице, на которую ссылаются разные идентификаторы.
Ответы
Ответ 1
В MySQL нет FULL OUTER JOIN
. См. 7.2.12. Outer Join Simplification и 12.2.8.1. JOIN Синтаксис:
Вы можете эмулировать FULL OUTER JOIN
, используя UNION (начиная с MySQL 4.0.0):
с двумя таблицами t1, t2:
SELECT * FROM t1
LEFT JOIN t2 ON t1.id = t2.id
UNION
SELECT * FROM t1
RIGHT JOIN t2 ON t1.id = t2.id
с тремя таблицами t1, t2, t3:
SELECT * FROM t1
LEFT JOIN t2 ON t1.id = t2.id
LEFT JOIN t3 ON t2.id = t3.id
UNION
SELECT * FROM t1
RIGHT JOIN t2 ON t1.id = t2.id
LEFT JOIN t3 ON t2.id = t3.id
UNION
SELECT * FROM t1
RIGHT JOIN t2 ON t1.id = t2.id
RIGHT JOIN t3 ON t2.id = t3.id
Ответ 2
Ответ cletus не совсем прав. UNION
удалит повторяющиеся записи, которые будет включать FULL OUTER JOIN
. Если вам нужны дубликаты, используя что-то вроде:
SELECT * FROM t1
LEFT JOIN t2 ON t1.id = t2.id
LEFT JOIN t3 ON t2.id = t3.id
LEFT JOIN t4 ON t3.id = t4.id
UNION ALL
SELECT * FROM t1
RIGHT JOIN t2 ON t1.id = t2.id
LEFT JOIN t3 ON t2.id = t3.id
LEFT JOIN t4 ON t3.id = t4.id
WHERE t1.id IS NULL
UNION ALL
SELECT * FROM t1
RIGHT JOIN t2 ON t1.id = t2.id
RIGHT JOIN t3 ON t2.id = t3.id
LEFT JOIN t4 ON t3.id = t4.id
WHERE t2.id IS NULL
UNION ALL
SELECT * FROM t1
RIGHT JOIN t2 ON t1.id = t2.id
RIGHT JOIN t3 ON t2.id = t3.id
RIGHT JOIN t4 ON t3.id = t4.id
WHERE t3.id IS NULL;
Ответ 3
Я только что сделал трюк для этого:
(select 1 from DUAL) d
LEFT OUTER JOIN t1 ON t1.id = t2.id
LEFT OUTER JOIN t2 ON t1.id = t2.id
точка состоит в том, что запрос из double делает точку исправления, а mysql может внешнее соединение с двумя другими таблицами с этим