Почему 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, на предмет правильного синтаксиса для использования возле 'внешнего соединения
airports
on Airlines.iaco_code = airport.iaco_code полное внешнее объединение 'в строке 4
Синтаксис выглядит правильно для меня. Я никогда раньше не делал много объединений, но мне нужны эти столбцы в таблице, на которую ссылаются различные идентификаторы.
6 ответов
Здесь нет FULL OUTER JOIN
в MySQL. Смотри 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
Ответ Клетуса не совсем правильный. 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;
Просто дополни случай, когда нужно 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
Я только что сделал трюк для этого:
(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 другие таблицы с этим
Чтобы дополнить представленные здесь ответы, я хотел бы поделиться примером объединения 4 таблиц с использованиемLEFT JOIN
на всеSELECT
утверждения, с более наглядным примером.
SELECT doctor.name, professor.name, singer.name, actor.name
FROM doctor
LEFT JOIN professor ON professor.id = doctor.id
LEFT JOIN singer ON singer.id = doctor.id
LEFT JOIN actor ON actor.id = doctor.id
UNION
SELECT doctor.name, professor.name, singer.name, actor.name
FROM professor
LEFT JOIN doctor ON doctor.id = professor.id
LEFT JOIN singer ON singer.id = professor.id
LEFT JOIN actor ON actor.id = professor.id
UNION
SELECT doctor.name, professor.name, singer.name, actor.name
FROM singer
LEFT JOIN doctor ON doctor.id = singer.id
LEFT JOIN professor ON professor.id = singer.id
LEFT JOIN actor ON actor.id = singer.id
UNION
SELECT doctor.name, professor.name, singer.name, actor.name
FROM actor
LEFT JOIN doctor ON doctor.id = actor.id
LEFT JOIN professor ON professor.id = actor.id
LEFT JOIN singer ON singer.id = actor.id;
SELECT * возвращает все столбцы из t1 и t2. Что, если нам нужны определенные столбцы из t1 и t2?
Я ищу альтернативу MySQL SELECT Customer.C_name, Orders.amt FROM Customer FULL OUTER JOIN Orders ON Customer.C_id = Orders.cus_id;
В таблице клиентов есть C_id и C_name, а в таблице Orders — order_id, cus_id и amt, ГДЕ C_id = cus_id — это отношение.