运行删除查询,直到postgresql中的行受到影响

时间:2013-06-03 15:55:49

标签: sql postgresql duplicates postgis

我正在使用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从上一个查询中接收受影响的行数。

非常感谢您提供的任何帮助!

1 个答案:

答案 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
                 )