5 votos

¿Cómo adaptar una consulta PostGIS para modificar la tabla de entrada en lugar de crear una tabla nueva?

Utilizo la siguiente consulta SQL para crear una tabla que contenga polígonos disociados de una tabla existente:

-- Schema: public
-- Table: t_union
-- Input table: input_table

CREATE TABLE public.t_union AS SELECT
    row_number() over() AS gid,
    sbqry.geom
FROM 
(SELECT
    (ST_Dump(ST_Union(geom))).geom::geometry(Polygon, /*SRID*/) AS geom
FROM public.input_table
) AS sbqry;

Características de los polígonos de entrada: enter image description here

Características de los polígonos de salida: enter image description here

¿Hay alguna forma de modificar los polígonos de la tabla de entrada en lugar de crear una tabla nueva?

Edición 1:

Mientras tanto, he creado una consulta SQL para modificar la tabla de entrada:

INSERT INTO public.input_table
SELECT
    row_number() over() + 100000 AS gid,
    sbqry.geom
FROM 
(SELECT
    (ST_Dump(ST_Union(geom))).geom::geometry(Polygon, /*SRID*/) AS geom
FROM public.input_table
) AS sbqry;

DELETE FROM public.input_table WHERE gid < 100000;
UPDATE public.input_table SET gid = gid - 100000;

row_number() over() + 100000 AS gid es una torpe solución para ignorar los valores gid existentes y no sé cómo borrar las geometrías de entrada de forma sencilla.

EDITAR 2:

Tal vez esto pueda resolverse utilizando UPDATE y SET :

UPDATE public.input_table SET (geom) =
(SELECT COALESCE
    ((ST_Dump(ST_Union(geom))).geom::geometry(Polygon, /*SRID*/))
FROM public.input_table);

Lamentablemente, se produce un error al ejecutar la consulta:

set-valued function called in context that cannot accept a set

0 votos

¿Cómo se relacionan las características de salida y las de origen: por ID o de algún modo?

1 votos

He subido dos imágenes para ilustrar la pregunta. La numeración de los polyongs no importa mientras los valores sean únicos.

0 votos

¿Cómo se gestionaría la eliminación de algunos polígonos de la tabla original? Estaría haciendo una caída y crear con el mismo esquema con el fin de lograr esto?

5voto

ninetwozero Puntos 129

No puede eliminar líneas de la tabla que está seleccionando en ese momento. Pero puede utilizar su solución en "Edición 1" con una tabla temporal:

BEGIN;

CREATE TEMP TABLE temp1 ON COMMIT DROP AS
SELECT
    row_number() over() AS gid,
    sbqry.geom AS geom
FROM 
(SELECT
    (ST_Dump(ST_Union(geom))).geom::geometry(Polygon, /*SRID*/) AS geom
FROM public.input_table
) AS sbqry;

TRUNCATE public.input_table;
INSERT INTO public.input_table (gid, geom) SELECT gid, geom FROM temp1;

COMMIT;

Nota: No he comprobado tu parte de la consulta para el tema select/union...

0 votos

Tu consulta funciona perfectamente. Sólo como información: UPDATE y SET no se puede utilizar en este caso?

0 votos

En SQL, la acción UPDATE sirve para actualizar filas existentes una a una, y la fusión de filas no se considera una actualización. Si realmente quieres usar UPDATE, puedes actualizar la "primera" fila de la futura unión para que sea la nueva unión y luego borrar las demás, el código SQL será realmente más complicado, pero es posible.

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X