PostgreSQL обновляет все строки столбцов с помощью подвыбора без связи между таблицами.Могу ли я избежать plpgsql? - PullRequest
1 голос
/ 30 марта 2012

Этот SQL дает мне список идентификаторов и количество точек в полигоне.

select count(*), poly.gid 
from inpn p 
INNER JOIN half_degree poly ON 
    poly.the_geom && p.the_geom and CONTAINS(poly.the_geom, p.the_geom)
group by poly.gid

count   gid
10       1
30       2

..

Теперь я хочу обновить столбец таблицы (half_degree) с информацией о количестве.

update half_degree 
set inpn_count = (
    select count(*) 
    from inpn p 
    INNER JOIN half_degree poly ON 
        poly.the_geom && p.the_geom 
        and CONTAINS(poly.the_geom, p.the_geom)
    )

но это обновляет inpn_count с ОБЩЕЙ СЧЕТОМ точек во всех многоугольниках. Затем, если я добавлю группу по количеству ...

update half_degree 
set inpn_count=(
    select count(*) as i 
    from inpn p 
    INNER JOIN half_degree poly ON 
        poly.the_geom && p.the_geom
        and CONTAINS(poly.the_geom,p.the_geom) 
    group by i
    )

ERROR: Agreggate not authorised inside a GROUP BY

Что я могу сделать, если у меня нет связи между обеими таблицами? (чтобы добавить предложение WHERE в обновление sql). Можно ли избежать использования PLPGSQL?

1 Ответ

1 голос
/ 30 марта 2012
update half_degree poly
set inpn_count = p.total
from (
    select count(*) as total, p.the_geom
    from inpn p 
    INNER JOIN half_degree poly ON 
        poly.the_geom && p.the_geom and CONTAINS(poly.the_geom, p.the_geom)
    group by p.the_geom
    ) p
where poly.the_geom && p.the_geom and CONTAINS(poly.the_geom, p.the_geom)
...