sql查询获取冗余记录

时间:2010-10-22 05:18:37

标签: sql sql-server

我想从数据库中获取冗余记录。我的查询是否正确?

select (fields) 
from DB 
group by name, city
having count(*) > 1

如果有错,请告诉我如何更正。

另外,如果我想删除重复记录,它会起作用吗?

delete from tbl_name 
where row_id in 
   (select row_id from tbl_name group by name, city having count(*) > 1)

所以我可以像这样进行上述查询

DELETE FROM tb_name where row_id not in(select min(row_id) from tb_name groupBy(name, city) having count(*)>1)

2 个答案:

答案 0 :(得分:1)

您的语法错误:

select name, city, count(*) from table group by name, city having count(*) > 1

如果您对实际计数不感兴趣,请从查询中删除“, count(*)

答案 1 :(得分:1)

您的DELETE语法绝对是完全错误的 - 这不会有效。它会做的是删除有多个出现的所有行 - 不要留下任何数据...

在SQL Server 2005及更高版本中可以执行的操作是使用CTE(公用表表达式)和 ROW_NUMBER()排名功能:

;WITH Duplicates AS
(
    SELECT 
      Name, City, 
      ROW_NUMBER() OVER (PARTITION BY Name, City ORDER BY City) AS 'RowNum'
)
DELETE FROM dbo.YourTable
WHERE RowNum > 1

您基本上通过(name, city)组合创建数据的“分区” - 这些对中的每一对都将从1开始获得序列号。

那些有多个出现的人也会在该CTE中有RowNum > 1的条目 - 只需删除所有这些条目并完成重复工作!

了解Using Common Table Expressions in SQL Server 2005Ranking Functions and Performance in SQL Server 2005(或参阅有关这些主题的MSDN文档)