Почему MySQL сообщает о синтаксической ошибке в FULL OUTER JOIN? - PullRequest
42 голосов
/ 05 марта 2010
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 на Airlines.iaco_code = airport.iaco_code полное внешнее соединение 'в строке 4

Синтаксис выглядит правильно для меня. Я никогда раньше не делал много объединений, но мне нужны эти столбцы в таблице, на которую ссылаются различные идентификаторы.

Ответы [ 4 ]

69 голосов
/ 05 марта 2010

В MySQL нет FULL OUTER JOIN. См. 7.2.12. Упрощение внешнего соединения и 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
12 голосов
/ 29 июля 2010

ответ Клетуса не совсем правильный. 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;
2 голосов
/ 08 марта 2018

Просто дополним случай, когда нужно FULL OUTER JOIN три таблицы t1, t2, t3. Вы можете сделать t1, t2, t3, в свою очередь, левый соединяет остальные две таблицы, затем объединение.

SELECT * FROM t1
LEFT JOIN t2 ON t1.id = t2.id
LEFT JOIN t3 ON t1.id = t3.id
UNION
SELECT * FROM t2
LEFT JOIN t1 ON t2.id = t1.id
LEFT JOIN t3 ON t2.id = t3.id
UNION
SELECT * FROM t3
LEFT JOIN t1 ON t3.id = t1.id
LEFT JOIN t2 ON t3.id = t2.id
1 голос
/ 05 октября 2016

Я только что сделал для этого трюк:

(select 1 from DUAL) d
LEFT OUTER JOIN t1 ON t1.id = t2.id
LEFT OUTER JOIN t2 ON t1.id = t2.id

Дело в том, что запрос из dual создает точку исправления, и mysql может внешне соединить 2 другие таблицы с этой

...