0

次のような定義を持つテーブルを返す PL/pgSQL 関数があります。

CREATE OR REPLACE FUNCTION get_movement_aggregation(movement_table varchar,place_table varchar,geom varchar,point_gid varchar, radius numeric DEFAULT 20000, inArea geometry DEFAULT NULL)
RETURNS TABLE(place_i integer) AS
-- actual code here

inAreaここで、別のテーブルから取得したジオメトリ (パラメーター) を使用して、この関数を使用したいと思います。次のクエリを試すと:

WITH x AS (
  SELECT wkb_geometry from tha_adm1 
  WHERE name_1 = 'Ubon Ratchathani' LIMIT 1
)
SELECT g.* 
FROM x,
get_movement_aggregation('movements','places','geom','place_id',14000,x.wkb_geometry)

次のエラーが表示されます。

ERROR: function expression in FROM cannot refer to other relations of same query level

私が実際に条項xの両方の部分で言及しているので、それは理にかなっています。FROM

サブクエリは次を返します。

+----------------------------------+
|   |  wkb_geometry                |
|   |  geometry(MultiPolygon,4326) |
+---+------------------------------+
| 1 | some very long number here   |
+---+------------------------------+

そして、このパラメーターを使用して、関数で作業しているレコードのリストをフィルター処理します。1 つの解決策は、フィルター処理されたレコードを使用して一時テーブルを作成し、関数にフィードすることですが、サブクエリでそれを行う方法があれば、それは素晴らしいことです。

ご回答ありがとうございます。

4

2 に答える 2

2

なぜこれではないのですか?

WITH x AS (
  SELECT wkb_geometry from tha_adm1 
  WHERE name_1 = 'Ubon Ratchathani' LIMIT 1
)
SELECT 
get_movement_aggregation('movements','places',
                         'geom','place_id',14000,x2.wkb_geometry)
FROM (SELECT * FROM x) as x2

WITHまたは、句のない、より単純な形式:

SELECT 
get_movement_aggregation('movements','places',
                         'geom','place_id',14000,x2.wkb_geometry)
FROM (SELECT wkb_geometry from tha_adm1 
  WHERE name_1 = 'Ubon Ratchathani' LIMIT 1) as x2

または、最終選択リストに関数呼び出しではなく明示的なフィールドを含める場合は、次のようにします。

SELECT g.* FROM 
 (SELECT get_movement_aggregation('movements','places',
                                  'geom','place_id',14000,x2.wkb_geometry)
    FROM (SELECT wkb_geometry from tha_adm1 
           WHERE name_1 = 'Ubon Ratchathani' LIMIT 1) as x2
 ) as g;
于 2013-01-28T17:34:29.297 に答える
1

この形式のクエリはLATERAL、SQL 標準で呼び出されます。このようなクエリのサポートは、PostgreSQL 9.3 で利用できるようになります。@depesz による優れたレビューをここで見つけることができます。

その前に、サブクエリを使用する必要があります。@Daniel は多くの可能性を概説しました。

于 2013-01-28T20:08:10.053 に答える