Neden MySQL TAM DIŞ JOIN bir sözdizimi hatası nedir?

3 Cevap php
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

O diyor ki

You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'outer join airports on airlines.iaco_code = airports.iaco_code full outer join' at line 4

Sözdizimi bana doğru görünüyor. Ben önce katılır bir çok yapmamıştım, ama ben çeşitli id ​​yıllardan tarafından başvurulan çapraz bir tabloda bu sütunları gerekir.

3 Cevap

Hiçbir FULL OUTER JOIN MySQL yoktur. Bkz 7.2.12. Outer Join Simplification ve 12.2.8.1. JOIN Syntax,

You can emulate FULL OUTER JOIN using UNION (from MySQL 4.0.0 on):

iki tablo ile 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

üç tablo t1, t2, t3 ile:

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

Cletus'un cevabı tam olarak doğru değildir. UNION bir FULL OUTER JOIN içerecek yinelenen kayıtları kaldırmak olacaktır. Senin gibi bir şey kullanarak çiftleri gerekiyorsa:

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;

Tam katılmak birliğe katılmak sol sonucu olarak aynı değil sonuç doğru katılacak.