1

私はPostgreSQL+PostGISを使用しています。

テーブルでは、同じテーブルの同じ列の異なる行に点と線のジオメトリがあります。私が実行する行を取得するには:

SELECT the_geom
FROM filedata
WHERE id=3

私がポイントを取りたい場合、私は実行します:

SELECT the_geom
FROM filedata
WHERE id=4

このWITH式に示されているように、ポイントとラインを一緒に取得したいのですが、代わりにテーブルに対して実際のクエリを使用します。

WITH data AS (
SELECT 'LINESTRING (50 40, 40 60, 50 90, 30 140)'::geometry AS road,
       'POINT (60 110)'::geometry AS poi)

SELECT ST_AsText(
ST_Line_Interpolate_Point(road, ST_Line_Locate_Point(road, poi))) AS projected_poi

FROM data;

この例では、データは手動で作成されたWITH式から取得されています。filedataテーブルから取り出したい。私の問題は、1つのテーブルの2つの異なる行からのデータを同時に処理する方法がわからないことです。

4

2 に答える 2

3

考えられる1つの方法:
別の行から別の値を取得するためのサブクエリ。

SELECT ST_AsText(
          ST_Line_Interpolate_Point(
             the_geom
            ,ST_Line_Locate_Point(
                the_geom
               ,(SELECT the_geom FROM filedata WHERE id = 4)
             )
          )
       ) AS projected_poi
FROM   filedata
WHERE  id = 3;
于 2012-10-15T07:43:53.617 に答える
2

自己参加を使用します。

SELECT ST_AsText(
  ST_Line_Interpolate_Point(fd_road.the_geom, ST_Line_Locate_Point(
      fd_road.the_geom,
      fd_poi.the_geom
  )) AS projected_poi
FROM filedata fd_road, filedata fd_poi
WHERE fd_road.id = 3 AND fd_poi.id = 4;

Erwinが指摘したように、代わりにサブクエリを使用して他の行をフェッチします。

1つの式で1つのテーブルの複数の行を使用するための主なオプションは次のとおりです。

  • 上記のように2つの異なるエイリアスを使用してテーブルを自己結合し、行をフィルタリングします。
  • Erwinの回答が示すように、サブクエリ式を使用して、1つを除くすべての行の値を取得します。
  • およびのようなウィンドウ関数を使用して、クエリ結果内の現在の行に関連する行を取得します。またlag()lead()
  • JOINテーブルを返すサブクエリ

後者の2つは、より単純な自己結合またはサブクエリ式では解決が困難または非効率的な問題を解決する、より高度なオプションです。

于 2012-10-15T07:34:33.667 に答える