我有一个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 |
+---+------------------------------+
我只是使用此参数来过滤我在函数中使用的记录列表。一种解决方案是创建一个包含已过滤记录的临时表并将其提供给函数,但如果有办法使用子查询,那就太棒了。
提前感谢您的回答。
答案 0 :(得分: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;
答案 1 :(得分:1)
这种形式的查询在SQL标准中称为LATERAL
。
PostgreSQL 9.3中将提供对此类查询的支持,您可以通过@depesz找到excellent review here。
在此之前你必须使用子查询,@丹尼尔概述了一系列的可能性。