[英]Query with multiple fields of a derived table
我有以下表格:
CREATE TABLE IF NOT EXISTS "walks"
(
id varchar(36),
PRIMARY KEY (id)
);
CREATE TABLE IF NOT EXISTS "points"
(
id varchar(36),
time timestamp(6) with time zone,
geometry geometry(Point, 4326),
walk_id varchar(36),
FOREIGN KEY (walk_id)
REFERENCES walks (id)
)
您可以將walk
視為表示串在一起的有序點集: ---O------O---OO-----O---
我正在嘗試按步行順序 select 所有點,但僅適用於與給定多邊形相交的步行(即在多邊形內有點的步行)。 另外,我想 select 一個 boolean 表示每個返回的點是否在該區域內。
我想出了以下查詢,它可以正常工作:
SELECT p.id,
w.id AS walk_id,
p.geometry,
p.id IN (SELECT id
FROM points
WHERE ST_INTERSECTS(p.geometry,
'SRID=4326;POLYGON((-81.8 -0.5,-81.1 -0.5,-81.1 -1.5,-81.8 -1.5,-81.8 -0.5))'
)) AS in_area
FROM points p
JOIN walks w
ON w.id = p.walk_id
WHERE w.id IN (SELECT w.id
FROM walks w
JOIN points p
ON p.walk_id = w.id
WHERE ST_INTERSECTS(p.geometry,
'SRID=4326;POLYGON((-81.8 -0.5,-81.1 -0.5,-81.1 -1.5,-81.8 -1.5,-81.8 -0.5))'
))
ORDER BY p.time ASC;
不過,這似乎效率低下,因為 PostGIS Intersects function 必須在所有內容上調用兩次。
是否可以 select 派生表或其他東西中的交叉點 ID 和步行 ID,然后在 SELECT (用於布爾值)和 WHERE (過濾正確的步行)中引用它們?
如果沒有樣本數據,很難完全理解您的用例,但也許 CTE 會簡化一些事情。 就像是:
WITH p AS (
SELECT id,geometry,walk_id,time,
ST_Intersects(geometry,
'SRID=4326;POLYGON((-81.8 -0.5,-81.1 -0.5,-81.1 -1.5,-81.8 -1.5,-81.8 -0.5))') AS in_area
FROM points )
SELECT p.id,w.id AS walk_id,p.geometry,p.in_area FROM p
JOIN walks w ON w.id = p.walk_id
WHERE p.in_area IS TRUE ORDER BY p.time ASC;
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.