我有以下表格:
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
不切实际。
答案 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