Использование псевдонима из оператора JOIN во FROM - PullRequest
9 голосов
/ 25 января 2012

Я пытаюсь создать запрос PostGIS, который использует псевдоним оператора JOIN в операторе FROM, но это невозможно.Есть ли другой способ сделать это?

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

Ответы [ 2 ]

9 голосов
/ 26 января 2012

Вы можете ввести дополнительный уровень подзапроса.

Так что в настоящее время у вас есть:

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
2 голосов
/ 25 января 2012

Почему бы вам не попробовать:

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

Возможно, вы захотите проверить размещение () на данный моментМне негде это проверить.

...