簡體   English   中英

查詢派生表的多個字段

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM