Message posté par : T. Rossini
----------------------------------------
Salut,
Il serait plus facile je pense d'écrire une fonction pl/psql pour arriver à ce que
vous voulez faire.
Cela dit :
-----------------
Code :
WITH RECURSIVE r(id, geom, attr) AS
(
SELECT
a.id,
a.geom
b.attr
FROM
poly a
JOIN
poly b
on a.attr is null and b.attr is not null
and st_intersects(a.geom, b.geom)
UNION ALL
SELECT
a.id,
a.geom,
r.attr
FROM
poly a
RIGHT JOIN r
ON a.id <> r.id --on veut éviter de reprendre les polygones déja traités
and a.attr is null and r.attr is not null
and st_intersects(a.geom, b.geom)
),
x as (
select * from r LIMIT 1000
)
UPDATE poly a
SET attr = x.attr
FROM (select id,max(attr) from x GROUP BY id) x
WHERE
a.id = x.id
;
-----------------
Les CTE récursives se composent généralement d'une partie de base (dans le code la
requête au dessus du UNION ALL) et d'une partie recursive (sous le UNION ALL). La CTE
s'arrête une fois qu'elle ne produit plus de nouveaux resultat (une nouvelle
itération de la partie recursive ne renvoie pas d'enregistrement).
Une difficulté de votre demande vient du fait qu'il peut potentiellement y avoir
plusieurs candidats pour chaque polygone sans attribut. Les GROUP BY et LATERAL JOIN
n'étant pas autorisés dans les CTE recursives, la solution que je propose utilise la
CTE pour générer toutes les combinaisons possibles et la requête selectionne la valeur à
attribuer (ici j'ai choisi la fonction max mais on peut en choisir une autre ou faire
cela de façon non déterministe).
Je ne suis pas sûr des bonnes performances de la requête, si elle fonctione.
----------------------------------------
Le message est situé
https://georezo.net/forum/viewtopic.php?pid=370394#p370394
Pour y répondre : geobd(a)ml.georezo.net ou reply de votre messagerie
Pour vous désabonner connectez-vous sur le forum puis Profil / Abonnement
--
Association GeoRezo - le portail géomatique
https://georezo.net