在SQL中,如何根据多列删除重复的行?

时间:2014-08-24 23:42:42

标签: sql sql-server duplicates no-duplicates

我知道我可以在下面运行以下查询来查找"重复"基于多列的行做这样的事情:

SELECT      PosId, OrgId
FROM        PosOrg
GROUP BY    PosId, OrgId
HAVING COUNT(*) > 1

但现在我想删除重复的行,以便上面的查询结束返回零行。我不关心我删除哪一行(只要根据这两列的唯一性,只剩下一行。

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

2 个答案:

答案 0 :(得分:7)

如果您有其他唯一id列,则可以

delete from PosOrg
where id not in
(
  SELECT      min(id)
  FROM        PosOrg
  GROUP BY    PosId, OrgId
)

答案 1 :(得分:4)

;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