2016-12-23 5 views
0

Ich Abfrage der Datenbank mit einem berechneten Feld und eine räumliche Abfrage, aber ohne irgendeine Unterabfrage, zu meinem Verständnis. Allerdings hält POSTGRESQL mich zu fragen für einen Alias ​​....POSTGRESQL, Nein Unterabfrage: Unterabfrage in FROM muss einen Alias ​​haben

SELECT geoid as destination, 
    lehd_graph.h_geocode asorigin,lehd_graph.S000 as population, 
    (ST_buffer(ST_Transform(ST_SetSRID(ST_Point(-74.01128768920898, 40.739843698929995), 4326), 3857), 500)))/
ST_area(lehd_map.the_geom_webmercator)) as fraction 
FROM lehd LEFT JOIN lehd_graph 
ON lehd.w_geocode = lehd_graph.w_geocode 
WHERE ST_intersects(lehd_map.the_geom_webmercator, 
ST_buffer(ST_Transform(ST_SetSRID(ST_Point(-74.01128768920898, 40.739843698929995), 4326), 3857), 500)) 

Syntaxfehler: Unterabfrage in FROM muss ein Alias ​​haben

Antwort

3

Sie haben ein paar Probleme mit Ihrer Anfrage. Der sofortige Fehler wird durch eine nicht übereinstimmende Anzahl von Klammern im ersten Aufruf an ST_Buffer() verursacht, aber selbst damit korrigiert wird Ihre Abfrage nicht ausgeführt werden; tatsächlich ist dieser erste Anruf eine sehr teure Methode, um die Fläche eines Kreises mit einem Radius von 500 Metern - die 785398.163 Quadratmeter genau ist - genau zu berechnen, so dass Sie diesen Anruf einfach loswerden und den Bereich einstecken können. (Ein zusätzliches Problem, das nun nicht mehr relevant ist, ist, dass Sie einen geometry durch einen skalaren Wert von ST_Area() zu teilen versuchten, die offensichtlich nicht möglich ist.)

Ein weiteres Problem ist, dass Sie nicht Tabelle enthalten waren lehd_map in Ihrem FROM Klausel; Ich habe es hier durch einen JOIN hinzugefügt.

SELECT geoid AS destination, 
     lehd_graph.h_geocode AS origin, 
     lehd_graph.S000 AS population, 
     785398.163/ST_Area(lehd_map.the_geom_webmercator)) AS fraction 
FROM lehd 
LEFT JOIN lehd_graph USING (w_geocode) 
JOIN lehd_map ON ST_Intersects(lehd_map.the_geom_webmercator, 
        ST_Buffer(
        ST_Transform(
         ST_SetSRID(
         ST_Point(-74.01128768920898, 40.739843698929995), 
         4326), 
         3857), 
        500) 
        ); 

Wenn Sie ein ungutes Gefühl über den Puffer des Punktes und den Bereich des Puffers zu trennen, dann könnte man sie in einem WAK kombinieren zu betonen, wie der Bereich mit dem gepufferten Punkt zusammenhängt:

WITH pt(geom, area) AS (
    VALUES (ST_Buffer(
       ST_Transform(
       ST_SetSRID(
        ST_Point(-74.01128768920898, 40.739843698929995), 4326), 3857), 500), 
      785398.163) -- 500 x 500 x pi: area of the buffer around the point 
) 
SELECT geoid AS destination, 
     lehd_graph.h_geocode AS origin, 
     lehd_graph.S000 AS population, 
     pt.area/ST_Area(lehd_map.the_geom_webmercator) AS fraction 
FROM pt 
JOIN lehd ON true 
LEFT JOIN lehd_graph USING (w_geocode) 
JOIN lehd_map ON ST_Intersects(lehd_map.the_geom_webmercator, pt.geom); 
+0

Ich kenne die Geocode API von Postgres nicht gut genug, um diese Art von Antwort zu geben, aber es sieht auf dem richtigen Weg! –

Verwandte Themen