2010-10-22 134 views
0

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

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) 
+1

你将不得不解释比这更好一点。你正在使用哪个数据库? – 2010-10-22 05:22:19

+0

我正在使用sql server db。我也想知道我怎么可以让查询重复记录从数据库 – NoviceToDotNet 2010-10-22 05:25:35

+0

你是什么意思重复的记录..我的意思是这张表有重复记录或只是你想采取一个记录重复? – kupa 2010-10-22 05:42:15

回答

1

你的DELETE语法绝对是完全的wron克 - 这不会工作。它所要做的是删除所有有不止一个occurence - 不会离开周围的任何数据...

你可以在SQL Server 2005做,Up是使用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文档)

+0

所以我可以使它像这样DELETE FROM tb_name where row_id not in(select min(row_id)from tb_name groupBy(name,city)having count( *)> 1) – NoviceToDotNet 2010-10-22 06:08:43

+0

@NoviceToDotNet:你不能这样做 - 你需要使用我在我的答案中显示的CTE方法 - 这将删除表中的重复项 – 2010-10-22 06:31:14

1

你有语法错误上面的查询:

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

如果你不感兴趣的实际数量,删除“, count(*)”来自查询

+0

我怎样才能让查询获得重复的记录? – NoviceToDotNet 2010-10-22 05:24:44

+0

为什么你需要一个替代品? – 2010-10-22 05:27:46

+0

我正在寻找其他方式来创建它 – NoviceToDotNet 2010-10-22 05:30:28