我想从数据库中获取冗余记录。我的查询是否正确?
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)
答案 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 2005和Ranking Functions and Performance in SQL Server 2005(或参阅有关这些主题的MSDN文档)