Страница 1 из 1

Обновление результата запроса (длина, количество) в таблице

Добавлено: 03 дек 2012, 16:44
HasT
В базе данных содержится линейный (дороги) и полигональный слой (города).
Необходимо получить количество линейных объектов и длину линейной геомтерии для каждого полигонального объекта (слой городов).
В pgAdmin выполняю запрос:

Код: Выделить всё

SELECT
     m."TownName",
sum(ST_Length_Spheroid(r.the_geom,'SPHEROID["WGS 84",6378137,298.257223563]'))/1000 AS Roads_Km,
count(*) AS Roads_Count
FROM
     "Streets" AS r,
     "Towns" AS m
WHERE ST_Intersects(m.the_geom, r.the_geom)
GROUP BY
     m."TownName"
ORDER BY
     m."TownName";
и результат сохраняю в csv таблицу.
Помогите с запросом, чтобы результат длины и количества линейной геометрии сохранялся в предварительно добавленные колонки (Length, Counts) полигонального слоя городов (при выполнении запроса выполнялось обновление значений) и +добавлялось время выполнения запроса в колонку TimeRun полигонального слоя.
Спасибо!

Re: Обновление результата запроса (длина, количество) в табл

Добавлено: 05 дек 2012, 10:24
Shifted
можно использовать примерно такую структуру:

Код: Выделить всё

select   data1,
            ... ,
           (select  sum(*) from t1 where ....  order by ... ) as sum,
           (select  count(*) from t2 where ....  order by ... ) as count
from t1 where ....  order by ... 

Re: Обновление результата запроса (длина, количество) в табл

Добавлено: 12 дек 2012, 17:20
HasT
С запросом разобрался. Ниже необходимый запрос:

Код: Выделить всё

UPDATE town t
SET 
length =calc.roadskm, -- column length in towns table
count = calc.roadscount, -- column count in towns table
updatetime = calc.time -- column updatetime in towns table
FROM (
SELECT
m.townname,
sum(ST_Length_Spheroid(r.the_geom,'SPHEROID["WGS 84",6378137,298.257223563]'))/1000 AS roadskm,
count(*) AS roadscount,
now() as time
FROM
streets AS r, --linear layer of roads
town AS m --polygonal layer of towns
WHERE ST_Intersects(m.the_geom, r.the_geom)
GROUP BY
m.townname
) calc 
WHERE t.townname = calc.townname;