我正在使用PostGIS处理一些复杂的土地使用数据。我有几个案例是创建了完全重复的多边形。我想删除这些重复项,我目前正在使用以下自连接SQL来删除重复项:
delete from landusetable where objectid in
(select max(x.objectid) from landusetable x JOIN landusetable y ON
ST_Equals(x.shape, y.shape) WHERE x.objectid <> y.objectid group by x.shape);
这可以很好地删除具有较高objectid值的副本,但是它只删除最高的objectid。如果有3个或更多重复多边形,我需要多次运行此语句,直到delete语句影响0行,然后我知道我已删除所有重复项。
因此,使用PL / pgSQL函数或其他控制结构,如何多次运行上述语句,直到收到“DELETE 0”,然后退出?我查看了文档,但是我找不到如何使用PL / pgSQL从上一个查询中接收受影响的行数。
非常感谢您提供的任何帮助!
答案 0 :(得分:2)
您可以使用子查询将row_number()
合并到查询中:
delete from landusetable
where objectid in (select x.objectid
from (select x.objectid,
ROW_NUMBER() over (partition by x.shape order by objectId) as seqnum
from landusetable x JOIN
landusetable y
ON ST_Equals(x.shape, y.shape)
WHERE x.objectid <> y.objectid
) xy
where seqnum > 1
)
当然,如果你愿意的话,也可以将子查询放入CTE中。
在这种情况下,使用“标准”SQL会产生更简单的查询。此版本使用where exists
而不是in
:
delete from landusetable
where exists (select 1
from landusetable lut2
where ST_Equals(lut2.shape, landusetable.shape) and
lut2.objectid > landusetable.objectid
)