2012-01-25 70 views
5

我試圖構建一個PostGIS查詢,它在FROM語句中使用JOIN語句的別名,但這是不可能的。還有另一種方法可以做到嗎?使用別名FROM FROM中的JOIN語句

SELECT DISTINCT 
ST_Buffer(
    ST_Centroid(geom), 
    ST_Area(geom)) 
FROM building AS b, ST_Transform(sg.geometry, 31467) AS geom 
LEFT JOIN surface_geometry AS sg ON b.id = sg.cityobject_id WHERE ST_Area(geom) < 100 

回答

3

您可以引入額外級別的子查詢。

所以目前你有:

SELECT DISTINCT ST_Buffer(ST_Centroid(geom), ST_Area(geom)) 
FROM building AS b, 
    ST_Transform(sg.geometry, 31467) AS geom 
    LEFT JOIN surface_geometry AS sg ON b.id = sg.cityobject_id 
WHERE ST_Area(geom) < 100 

(我改變了縮進,使更多一點它的意義,但我還是不明白:你似乎沒有從B使用的值任何地方)。你需要這樣的東西:

SELECT DISTINCT ST_Buffer(ST_Centroid(geom), ST_Area(geom)) 
FROM (
    SELECT ST_Transform(sg.geometry, 31467) AS geom 
    FROM building AS b 
     LEFT JOIN surface_geometry AS sg ON b.id = sg.cityobject_id 
) x 
WHERE ST_Area(geom) < 100 
+1

謝謝!這很好。建築物是需要的,因爲我只想要與建築物相關的surface_geometry元素。有許多與其他類型有關的surface_geometry元素。 – megges

+0

啊,在這種情況下,你可能想要在'building'和'surface_geometry'之間建立一個內部連接,外部連接在這裏並不是很有用。 – araqnid

1

爲什麼你會不會嘗試:

SELECT DISTINCT 
    ST_Buffer(ST_Centroid(ST_Transform(sg.geometry, 31467), 
       ST_Area(ST_Transform(sg.geometry, 31467))) 
FROM building b LEFT JOIN surface_geometry sg ON (b.id = sg.cityobject_id) 
WHERE ST_Area(ST_Transform(sg.geometry, 31467)) < 100; 

也有可能,這可能工作:

SELECT DISTINCT 
    ST_Buffer(ST_Centroid(geom), ST_Area(geom)) 
FROM building b LEFT JOIN surface_geometry sg ON (b.id = sg.cityobject_id) INNER JOIN 
    ST_Transform(surface_geometry.geometry, 31467) geom ON (ST_Area(geom) < 100); 

您可能需要驗證的(安置)作爲目前我沒地方去測試它。

+0

謝謝你的答案。第一個工作,但我認爲它不是很高性能(每個幾何都會變換3個),並且查詢包含不必要的重新排序,因此變得複雜。第二個不起作用它說:對錶<> – megges

+0

的FROM-clause-entry的無效引用我只是修改了可能使用完整表名稱的答案。 – Karlson

+0

與全表相同的錯誤。 – megges