简体   繁体   中英

Postgres union query returns strange result

I have the following tables:

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)
);

The following query is supposed to return the area that has been crossed the least, as well as how many times it was crossed and by which vessels.

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

Theoretically, this query should solve the question above. The problem is that I am getting (0 rows) as an answer, although I have been assured as to the opposite. I discovered it has something to do with the null values the UNION produced, but I don't have a clue how to fix this. Any ideas?

NOTE: The two tables have 31822 rows and 27308 rows respectively which makes a JOIN impractical.

You have the condition

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

However, in the union all you are explicitly setting geo1 to null and geo2 to null . Hence the query is returning 0 rows. You can change the where condition above to or , which would return rows.

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

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM