如何在 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
;
在我的 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
;