41


12

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サーバーのバージョンに対応するマニュアルで、4行目の 'outer join’airports.iaco_code = airports.iaco_code full outer join’の近くで使用する適切な構文を確認してください。 _

構文は私にとって正しいように見えます。 これまでに多くの結合を行ったことはありませんが、さまざまなIDによって相互参照されるテーブルにこれらの列が必要です。

4 Answer


68


MySQLには「FULL OUTER JOIN」はありません。 7.2.12。 外部結合の簡素化およびhttp://dev.mysql.com/doc/refman/5.0/en/join.html[12.2.8.1。 JOIN構文]:

_ _ UNION(MySQL 4.0.0以降)を使用して `FULL OUTER JOIN`をエミュレートできます:

2つのテーブル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

3つのテーブル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


クレトスの答えは正しくありません。 「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


3つのテーブルt1、t2、t3を「FULL OUTER JOIN」する必要がある場合は、ケースを補足してください。 t1、t2、t3を順に作成し、残りを2つのテーブルに結合してから、結合します。

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


私はちょうどこれのためにトリックを作りました:

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

ポイントは、デュアルからのクエリがフィックスポイントを作成し、mysqlが2つの他のテーブルを外部結合できることです