我使用计算字段和空间查询查询数据库,但没有任何子查询,据我所知。但是,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中的子查询必须具有别名
答案 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);