Postgres联合查询返回奇怪的结果

时间:2015-09-08 14:54:16

标签: sql postgresql postgis

我有以下表格:

CREATE TABLE geodat(
vessel UUID NOT NULL,
trip UUID NOT NULL,
geom geometry(LineString,4326),

PRIMARY KEY(vessel,trip)
);

CREATE TABLE areas(
gid SERIAL NOT NULL,
/* --other columns of little interest-- */
geom geometry(MultiPolygon,3035),

PRIMARY KEY(gid)
);

以下查询应该返回已经越过的区域,以及交叉的次数以及哪些船只。

SELECT vessel,MIN(cnt) as min_crossing,gid
FROM (
    SELECT vessel,COUNT(*) as cnt, gid
    FROM (
        SELECT vessel, null as geo1, geom as geo2, null as gid
        FROM geodat

        UNION ALL

        SELECT null,geom,null,gid FROM areas ) as P
    WHERE ST_Crosses(geo1,geo2) AND geo1 IS NOT NULL AND geo2 IS NOT NULL
    GROUP BY gid,vessel) as P1
GROUP BY gid,vessel

理论上,此查询应解决上述问题。问题是我得到(0行)作为答案,尽管我已经确定相反。我发现它与UNION产生的空值有关,但我不知道如何解决这个问题。 有什么想法吗?

注意: 这两个表分别有31822行和27308行,这使得JOIN不切实际。

1 个答案:

答案 0 :(得分:0)

你有条件

WHERE ST_Crosses(geo1,geo2) AND geo1 IS NOT NULL AND geo2 IS NOT NULL

但是,在union all中,您明确将geo1设置为null,将geo2设置为null。因此查询返回0行。 您可以将上面的where条件更改为or,这将返回行。

WHERE ST_Crosses(geo1,geo2) AND geo1 IS NOT NULL OR geo2 IS NOT NULL