为什么MySQL在FULL OUTER JOIN上报告语法错误?

Jos*_*h K 48 php mysql sql join mysql-error-1064

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
Run Code Online (Sandbox Code Playgroud)

它说

您的SQL语法有错误; 查看与您的MySQL服务器版本对应的手册,以便airports在第4行的'aerites_iaco_code = airports.iaco_code全外连接' 附近使用正确的语法

语法看起来对我来说.我之前从未做过很多连接,但是我需要在表中使用各种id交叉引用的列.

cle*_*tus 74

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
Run Code Online (Sandbox Code Playgroud)

有三个表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
Run Code Online (Sandbox Code Playgroud)

  • 您的回答并不正确,请参阅[Xelrach的回答](http://stackoverflow.com/a/3357262/52499)或[此评论](http://stackoverflow.com/questions/4796872/full-outer-加入在MySQL的#comment21960067_4796911). (3认同)

小智 13

克莱图斯的回答并不完全正确.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;
Run Code Online (Sandbox Code Playgroud)

  • 我希望mysql可以添加这个.可能只有5行C代码.我们每个人都要多次编写这5行额外的代码.从事mysql工作的人应该将此视为功能请求. (3认同)
  • @MarkAmery:此查询不依赖于具有 NOT NULL 列的表。相反,此查询依赖连接谓词(ON 子句中的条件)来保证“匹配”行中的列的非 NULL 值。这依赖于与 NULL 值一起使用时*相等比较*运算符的行为。(我们知道,即使“foo IS NULL”,“foo = NULL”也不会返回 TRUE。) (2认同)