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

时间:2010-03-05 03:02:18

标签: 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

它说

  

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

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

4 个答案:

答案 0 :(得分:69)

MySQL中没有FULL OUTER JOIN。请参阅7.2.12. Outer Join Simplification12.2.8.1. JOIN Syntax

  

您可以使用模仿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

答案 1 :(得分:12)

克莱特斯的答案不太对劲。 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 :(得分:2)

当您需要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

答案 3 :(得分:1)

我刚刚为此做了一个技巧:

(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个表外连接到那个