子查询中有多行

时间:2013-08-23 16:55:20

标签: postgresql postgis mapserver

我正在尝试在我的图层中创建一个禁区的上下文。

我正在尝试以下Map File / SQL组合

DATA "geom FROM public.data"
FILTER "layer = %layer_id% AND ST_CONTAINS(ALL(SELECT the_geom FROM public.exclusion_zone WHERE layer = %layer_id%), geom) != true"

当有超过1个禁区时,显然这会中断,所以我该怎么做?

我已经尝试过只能告诉mapProc,MapServer找不到它的SRID,因为它没有出现在几何表中

我收到的错误是

Query error. Error (ERROR: more than one row returned by a subquery used as an expression ) executing query

2 个答案:

答案 0 :(得分:1)

试试这个:

DATA "geom FROM public.data"
FILTER "
    layer = %layer_id% and
    not exists
    (
        SELECT *
        FROM public.exclusion_zone
        WHERE layer = %layer_id% and ST_CONTAINS(the_geom, geom)
    )

答案 1 :(得分:0)

这看起来更像是MapServer相关问题而不是PostgreSQL / PostGIS问题 您使用的是什么版本的MapServer?

最好避免使用FILTER参数并使用子查询从postgis中检索您的数据,明确提供SRID和唯一ID字段:您可以获得更好的性能,更多控制,减少由MapServer和PostgreSQL查询优化器引起的麻烦“missunderstandings”。

我不知道你的实际数据,但是粘贴你的行代码并假设gid表中有一个public.data字段,你应该得到类似的东西:

DATA "geom from (
        SELECT gid, geom 
            FROM public.data 
            WHERE layer = %layer_id% AND ST_CONTAINS(ALL(SELECT the_geom FROM public.exclusion_zone WHERE layer = %layer_id%), geom) != true 
    ) as layer using unique gid using srid = %layer_id%"

当然根据您的数据更改%srid%,或使用-1。根据您的PostGIS和MapServer版本,您甚至可以避免它(好吧,它严格依赖于您的数据和查询),让MapServer为您获取它,但这是一个无用的开销。

关于您的查询,它让我觉得可以在那里进行优化,但我想这只是一个测试查询,将被替换为最终版本。