我有一个有效的 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 中执行此操作)。
如果您还从
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;