2012-01-25 8 views
5

FROMステートメントでJOINステートメントのエイリアスを使用するPostGISクエリを作成しようとしていますが、これは不可能です。それを行う別の方法がありますか?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

関連する問題