如何在 PostgreSQL/Postgis 中连接两个结果不相等(不同的列和行)的查询

How to join two queries with unequal results (different columns and rows) in PostgreSQL/Postgis

在我的 PostgreSQL/PostGIS 数据库中,我有两个不同结果的查询。

查询 1:

With buffer as 
(
    SELECT   gid, 
             (ST_DumpPoints(ST_Buffer(geom,50,3))).geom as geom
    FROM     cp 
    group by gid, geom --cp being point layer with one row
    UNION ALL 
    SELECT   gid, 
             geom 
    FROM     cp        --cp being point layer with only one row
)
SELECT   gid,
         generate_series(1,12) id,
         (ST_Dump(ST_DelaunayTriangles(ST_Collect(geom),0, 0))).geom as geom
FROM     buffer
group by gid
order by gid, id

returns 三列(gid、id、geom)12 行。同时,查询 2:

With buffer as 
(
    SELECT   gid, 
             (ST_DumpPoints(ST_Buffer(geom,50,3))).geom as geom
    FROM     cp 
    group by gid, geom --cp being the same point layer
    UNION ALL 
    SELECT   gid, 
             geom 
    FROM     cp        -- cp being the same point layer
)
Select distinct geom as pts, 
       gid 
from   buffer

returns 两列 (pts, gid),共 13 行。我想在 gid 的基础上加入这两个查询,因为我想为大量点自动执行此过程。我记得,首先查询 returns 12 segments/rows (triangles/pie-like wedges geometry) around point layer (cp having gid = 1)。第二个查询 returns 这些三角形的外顶点(13 个点)。我需要最有效地加入这些查询,以便所需的输出应该产生四列,如:

 gid, id, geom, pts
 1    1   xxx   yyy
 1    2   xxx   yyy
 1    3   xxx   yyy
 1    4   xxx   yyy
 1    5   xxx   yyy
 1    6   xxx   yyy
 1    7   xxx   yyy
 1    8   xxx   yyy
 1    9   xxx   yyy
 1    10  xxx   yyy
 1    11  xxx   yyy
 1    12  xxx   yyy
 1    13  NULL  yyy

任何人都可以帮我加入以上两个查询的不相等结果吗?任何指针将不胜感激。

尝试这样(我只是 CTE 你的陈述和外连接):

with a as (
    With buffer as 
    (
        SELECT   gid, 
                 (ST_DumpPoints(ST_Buffer(geom,50,3))).geom as geom
        FROM     cp 
        group by gid, geom --cp being point layer with one row
        UNION ALL 
        SELECT   gid, 
                 geom 
        FROM     cp        --cp being point layer with only one row
    )
    SELECT   gid,
             generate_series(1,12) id,
             (ST_Dump(ST_DelaunayTriangles(ST_Collect(geom),0, 0))).geom as geom
    FROM     buffer
    group by gid
    order by gid, id
)
, b as (

    With buffer as 
    (
        SELECT   gid, 
                 (ST_DumpPoints(ST_Buffer(geom,50,3))).geom as geom
        FROM     cp 
        group by gid, geom --cp being the same point layer
        UNION ALL 
        SELECT   gid, 
                 geom 
        FROM     cp        -- cp being the same point layer
    )
    Select distinct geom as pts, 
           gid 
           , row_number() over () as id
    from   buffer
)
select * 
from b
left outer join a on b.gid = a.gid and b.id = a.id
;