Я считаю, что вам нужно избавиться от подзапросов и просто поместить таблицы в предложение WHERE
. Если я вас правильно понял, вы хотели получить единственное значение с ближайшей дорогой к данному свету, поэтому все, что вам нужно, это вычислить расстояние до всех возможных дорог, ORDER BY
результат и получить первое значение, например:
Пример данных
CREATE TABLE public.street_lights (ogc_fid INT, wkb_geometry GEOMETRY);
CREATE TABLE public.roads (ogc_fid INT, wkb_geometry GEOMETRY);
INSERT INTO street_lights VALUES (1,'SRID=4326;POINT(1 2)');
INSERT INTO roads VALUES (1,'SRID=4326;POINT(1 2.50)'),
(2,'SRID=4326;POINT(1 2.42)');
Запрос
SELECT roa.ogc_fid, ST_Distance(ST_Transform(lig.wkb_geometry, 2855),
ST_Transform(roa.wkb_geometry, 2855)) AS distance
FROM public.street_lights lig, public.roads roa
WHERE lig.ogc_fid = 1
ORDER BY distance LIMIT 1;
ogc_fid | distance
---------+------------------
2 | 61533.2214579388
(1 Zeile)
Вопрос 2:
как мне изменить запрос для добавления нового столбца в publi c .street_lights где будет road_id с минимальным расстоянием.
Вы можете создать новый столбец с помощью оператора ALTER TABLE
, например,
ALTER TABLE public.street_lights ADD COLUMN road_id_min_dist INT;
И заполнить этот новый столбец road_id
вы можете использовать тот же запрос в CTE
:
WITH j AS (
SELECT lig.ogc_fid AS light_id, roa.ogc_fid AS road_id,
ST_Distance(ST_Transform(lig.wkb_geometry, 2855),
ST_Transform(roa.wkb_geometry, 2855)) AS distance
FROM public.street_lights lig, public.roads roa
ORDER BY distance LIMIT 1)
UPDATE public.street_lights SET road_id_min_dist = j.road_id
FROM j WHERE j.light_id = ogc_fid;
А вот ваши данные ..
SELECT ogc_fid,ST_AsText(wkb_geometry), road_id_min_dist
FROM street_lights;
ogc_fid | st_astext | road_id_min_dist
---------+------------+------------------
1 | POINT(1 2) | 2
(1 Zeile)