2017-03-27 4 views
0

Warum ist mein PostgreSQL-ParserSyntaxfehler bei oder in der Nähe von schließenden Klammer der FROM Argument in SQL-Abfrage

ERROR: syntax error at or near ")" 
LINE 1: ... FROM continent LEFT JOIN (country INNER JOIN city) sw ON sw... 

auf die folgende SQL-Abfrage zurückkehrt, die alle Kontinente und deren Anzahl von Ländern zur Liste versucht, deren Kapital der Bevölkerung größer als 3 Millionen:

SELECT continent.Name, COUNT(country.Name) 
FROM continent LEFT JOIN (country INNER JOIN city) sw 
ON sw.country.Area = continent.Area AND sw.country.Capital = sw.city.Name 
AND sw.city.Country = sw.country.Name AND sw.city.Population > 3000000 
GROUP BY continent.Name; 
+1

I don Ich sehe keine Join-Bedingung für das "INNER JOIN" - ich vermute, dass sich Postgres darüber beschweren. – jmelesky

+0

Sie haben Recht. Richtig. –

+0

'(Land INNER JOIN Stadt)' ergibt keinen Sinn. Was genau versuchst du da zu machen? –

Antwort

1

Erweitern Sie auf meinen Kommentar, es sieht aus wie Sie Ihre Join-Bedingungen gemischt zusammen bekommen. So etwas wie dies funktionieren könnte:

SELECT continent.Name, COUNT(country.Name) 
FROM continent 
    LEFT JOIN 
    (country INNER JOIN city 
    ON sw.country.Capital = sw.city.Name 
    AND sw.city.Country = sw.country.Name) sw 
    ON sw.country.Area = continent.Area 
WHERE sw.city.Population > 3000000 
GROUP BY continent.Name; 

bearbeiten

, die nicht funktioniert - die sw Tabellengruppe verwiesen wird, bevor er erklärt wird. Lassen Sie uns versuchen Sie es erneut:

SELECT continent.Name, COUNT(country.Name) 
FROM continent 
    LEFT JOIN country 
    ON country.area = continent.area 
    INNER JOIN city 
    ON country.Capital = city.Name 
    AND city.Country = country.Name 
WHERE city.Population > 3000000 
GROUP BY continent.Name; 

Ich bin nicht sicher, dass dies kommen Logik ist genau das, was Sie wollen, aber die Abfrage analysiert, ohne Frage.

bearbeiten 2

Und eine letzte Version. Dies ist (soweit ich das beurteilen kann) gehen, um die gleichen Ergebnisse wie die zweite Abfrage zurück - zumindest, erzeugen sie den gleichen Plan - aber genauer spiegelt Ihre erste Abfrage:

SELECT continent.Name, COUNT(sw.Country) 
FROM continent 
    LEFT JOIN 
    (country INNER JOIN city 
    ON country.Capital = city.Name 
    AND city.Country = country.Name) sw 
    ON sw.Area = continent.Area 
WHERE sw.Population > 3000000 
GROUP BY continent.Name; 
+0

Der Parser scheint auf die Tatsache zu reagieren, dass die Verbindung in Klammern keine ON-Bedingungen hat. –

+1

Ich habe einen neuen Versuch bearbeitet und hinzugefügt. – jmelesky

Verwandte Themen