使用左连接从自身进行 POSTGIS 更新

问题描述 投票:0回答:1

我有一个有效的 SELECT 语句,但由于 SQL 不是我的强项,我不知道如何将其变成 UPDATE 函数。我还有其他的工作,但似乎是 JOIN 让我来到这里。

我尝试了一些我能想到的方法: UPDATE ptp_links SET geom = ST_MAKELINE (这会导致每个记录都获得相同的行) UPDATE FROM SELECT(这个让我接近,但抛出一个关于列“geom”是几何类型但表达式是记录类型的错误)

这是我的选择查询:

SELECT 
  ST_MAKELINE(
    ST_POINT(out_bs.longitude::DOUBLE PRECISION, out_bs.latitude::DOUBLE PRECISION, 4326),
    ST_POINT(CASE WHEN ptp.link_purpose = 'backhaul'
      THEN in_bs.longitude::DOUBLE PRECISION
      ELSE ptp.in_address_geo_x::DOUBLE PRECISION
    END,
    CASE WHEN ptp.link_purpose = 'backhaul'
      THEN in_bs.latitude::DOUBLE PRECISION
      ELSE ptp.in_address_geo_y::DOUBLE PRECISION
    END, 4326)
  )
FROM ptp_links ptp
LEFT JOIN base_stations in_bs ON ptp.in_base_station = in_bs.id
LEFT JOIN base_stations out_bs ON ptp.out_base_Station = out_bs.id;

我想要做的是将 ST_MAKELINE 生成的行写回到 ptp_links 表中,写入名为 geom 的列(如果有人知道我将如何在 PostGIS 中执行此操作)。

postgresql postgis
1个回答
0
投票

如果您还从

ptp_links
获取标识符,则可以将
select
包装在
with
CTE
中,并将其用作
update
语句的源:

WITH update_batch AS (
SELECT ptp.in_base_station,--something uniquely identifying the row you want to update
  ST_MAKELINE(
    ST_POINT(out_bs.longitude::DOUBLE PRECISION, out_bs.latitude::DOUBLE PRECISION, 4326),
    ST_POINT(CASE WHEN ptp.link_purpose = 'backhaul'
      THEN in_bs.longitude::DOUBLE PRECISION
      ELSE ptp.in_address_geo_x::DOUBLE PRECISION
    END,
    CASE WHEN ptp.link_purpose = 'backhaul'
      THEN in_bs.latitude::DOUBLE PRECISION
      ELSE ptp.in_address_geo_y::DOUBLE PRECISION
    END, 4326)
  ) AS new_geom
FROM ptp_links ptp
LEFT JOIN base_stations in_bs ON ptp.in_base_station = in_bs.id
LEFT JOIN base_stations out_bs ON ptp.out_base_Station = out_bs.id )
UPDATE ptp_links AS target
SET geom = new_geom
FROM update_batch AS source
WHERE source.in_base_station=target.in_base_station;
© www.soinside.com 2019 - 2024. All rights reserved.