postgres-Spalte alias problem
Als Neuling in Postgresql (ich bin bewegt über, da ziehe ich meine Website auf heroku wer nur unterstützen, ich bin beim umgestalten, einige meiner Abfragen und code. Hier ist ein problem, dass ich nicht ganz verstehen, die problem mit:
PGError: ERROR: column "l_user_id" does not exist
LINE 1: ...t_id where l.user_id = 8 order by l2.geopoint_id, l_user_id ...
^
...Abfrage:
select distinct
l2.*,
l.user_id as l_user_id,
l.geopoint_id as l_geopoint_id
from locations l
left join locations l2 on l.geopoint_id = l2.geopoint_id
where l.user_id = 8
order by l2.geopoint_id, l_user_id = l2.user_id desc
Klausel "l.user_id als l_user_id, l.geopoint_id als l_geopoint_id" wurde Hinzugefügt, da offenbar postgres nicht wie order-Klauseln mit nicht selektierte Felder. Aber die Fehler, die ich jetzt bekommen, macht es so Aussehen, ich bin auch nicht immer aliasing. Jemand mit postgres Erfahrung das problem sein?
Bin ich wahrscheinlich zu haben, eine Reihe von diesen Problemen-Abfragen funktionierte gut in mySql...
- Desto leichter ist es zu Lesen, desto einfacher ist es für uns, Ihnen zu helfen...
Du musst angemeldet sein, um einen Kommentar abzugeben.
In PostgreSQL können Sie nicht verwenden Ausdruck mit einem alias in Ordnung. Nur plain-Aliase, die dort arbeiten. Ihre Abfrage sollte wie folgt Aussehen:
Ich nehme an, du meinst, dass
l2.user_id=l.user_id
sollte als erste gehen.Dies ist relevant, Nachricht auf PostgreSQL-general-mailing-Liste. Das folgende ist in der Dokumentation der
ORDER BY
- Klausel:Also keine Aliase beim Ausdruck verwendet.
Haben Sie:
in Ihrer Abfrage. Das ist illegal syntax. Entfernen Sie die
= l2.user_id
Teil (verschieben nachwhere
wenn man die join-Bedingungen) und es sollte funktionieren.Update Unten wählen (mit
= l2.user_id
entfernt) sollte gut funktionieren. Ich habe es getestet (mit verschiedenen Tabellen - /Spaltennamen, natürlich) auf Postgres 8.3Ich lief in das gleiche problem mithilfe von Funktionen aus fuzzystrmatch - insbesondere der levenshtein-Funktion. Ich musste sowohl die Art der string-Distanz, und die Ergebnisse filtern, indem Sie die Zeichenfolge Abstand. Ich war ursprünglich versucht:
Aber, natürlich, ich habe den Fehler "Spalte"dist" nicht vorhanden" aus der WHERE-Klausel. Ich versuchte dies und es funktionierte:
Aber ich brauchte zu haben, daß die Qualifikation in der WHERE-Klausel. Jemand anderes, der in dieser Frage sagte Sie, dass die WHERE-Klausel ausgewertet werden, bevor die BESTELLUNG DURCH, damit die Spalte nicht vorhanden war, wenn es eine Bewertung der WHERE-Klausel. Nach dieser Beratung habe ich herausgefunden, dass eine geschachtelte SELECT-Anweisung funktioniert der trick:
Beachten Sie, dass der "items" Tabelle-alias erforderlich ist, und die dist-Spalte alias kann in der äußeren SELECT-denn es ist eindeutig in der Aussage. Es ist ein bisschen funky und ich bin überrascht, dass es auf diese Art und Weise in PG -, aber es scheint nicht zu nehmen Sie einen Leistungseinbruch, so bin ich zufrieden.
"wurde Hinzugefügt, da offenbar postgres nicht wie order-Klauseln mit nicht selektierte Felder"
"Soweit die Bestellung durch geht - ja, PostgresQL und vielen anderen Datenbanken) nicht erlaubt, die Bestellung von Spalten, die nicht aufgeführt sind in der select-Klausel."
Einfach nur unwahr.
=> SELECT id FROM t1 ORDER BY Besitzer LIMIT 5;
id
30
10
20
50
40
(5 Zeilen)