web-dev-qa-db-fra.com

Pourquoi MySQL signale-t-il une erreur de syntaxe sur 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

Il dit que

Vous avez une erreur dans votre syntaxe SQL; consultez le manuel qui correspond à la version de votre serveur MySQL pour la bonne syntaxe à utiliser près de 'jointure externe airports sur airlines.iaco_code = aéroports.iaco_code jointure externe complète' à la ligne 4

La syntaxe me semble juste. Je n'ai jamais fait beaucoup de jointures auparavant, mais j'ai besoin de ces colonnes dans une table qui est référencée par divers identifiants.

45
Josh K

Il n'y a pas FULL OUTER JOIN dans MySQL. Voir 7.2.12. Simplification de la jointure externe et 12.2.8.1. Syntaxe JOIN :

Vous pouvez émuler FULL OUTER JOIN en utilisant UNION (à partir de MySQL 4.0.0):

avec deux tables 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

avec trois tables 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
71
cletus

la réponse de Cletus n'est pas tout à fait juste. UNION supprimera les enregistrements en double qu'un FULL OUTER JOIN inclurait. Si vous avez besoin de doublons en utilisant quelque chose comme:

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;
12
EmDash

Complétez simplement le boîtier lorsque vous devez FULL OUTER JOIN trois tableaux t1, t2, t3. Vous pouvez faire t1, t2, t3, à son tour, à gauche joint les deux autres tables, puis l'union.

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
2
Song Zhengyi

Je viens de faire un tour pour ça:

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

le fait est que la requête de dual fait un point fixe, et mysql peut joindre extérieurement les 2 autres tables à celle

1
user5728636