POSTGRESQL,无子查询:FROM中的子查询必须具有别名

时间:2016-12-23 00:58:50

标签: sql postgresql postgis

我使用计算字段和空间查询查询数据库,但没有任何子查询,据我所知。但是,POSTGRESQL一直在问我一个别名......

 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))

语法错误:FROM中的子查询必须具有别名

1 个答案:

答案 0 :(得分:3)

您的查询存在一些问题。立即错误是由第一次调用ST_Buffer()中的括号数量不匹配引起的,但即使更正了,您的查询也不会执行;事实上,第一次通话是一种非常昂贵的方法,不精确地计算半径为500米的圆的面积 - 精确到785398.163平方米 - 所以你可以摆脱那个电话并插入该区域。 (另一个现在已不再相关的问题是,您试图将geometry除以ST_Area()的标量值,这显然是不可能的。)

另一个问题是您未在lehd_map子句中包含表FROM;我通过JOIN在这里添加了它。

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)
                   );

如果您对分离点的缓冲区和缓冲区的区域感到不安,那么您可以将它们组合在CTE中以强调该区域与缓冲点的关系:

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);