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   |
+---+------------------------------+

我只是使用这个参数来过滤我在函数中使用的记录列表。一种解决方案是使用过滤后的记录创建一个临时表并提供给该函数,但如果有一种方法可以使用子查询来做到这一点,那就太好了。

预先感谢您的回答。

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 回答