在SQL中,如何基于多列删除重复行?

6
我知道可以运行以下查询来查找基于多个列的“重复”行,方法如下所示:
SELECT      PosId, OrgId
FROM        PosOrg
GROUP BY    PosId, OrgId
HAVING COUNT(*) > 1

但现在我想删除重复行,以便上面的查询最终返回零行。我不关心要删除哪一行(只要基于这两列的唯一性只保留一行即可)。

在SQL中删除这些重复项的正确方法是什么?


那张表的其他列是什么?有主键约束吗? - Brian DeMilia
2个回答

10
如果您有另一个唯一的id列,可以这样做。
delete from PosOrg
where id not in
(
  SELECT      min(id)
  FROM        PosOrg
  GROUP BY    PosId, OrgId
)

1
我不需要在这里加一个"where > 1"吗? - leora
不,你要删除每个组中不是 min(id) 的所有记录,也就是说,删除所有重复记录。 - juergen d
@leora 不需要,如果表格上有一个唯一的名为ID的字段。你应该在问题中添加是否存在这样的字段。 - Brian DeMilia

7
;WITH CTE
AS (
    SELECT PosId
          ,OrgId
          ,ROW_NUMBER() OVER (PARTITION BY PosId , OrgId ORDER BY PosId , OrgId) rn
    FROM   PosOrg
   )
DELETE FROM CTE
WHERE rn > 1

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接