SQL Server 2008列出具有重复值的行

时间:2013-02-01 19:25:41

标签: sql-server sql-server-2008 sql-server-2008-r2

我有一个SQL服务器(2008 R2),用于存储表中文件的元数据。每个文件都有自己的Row,每个文件都有一个为其计算和存储的MD5。我想打印一个MD5值在服务器中出现多次的文件列表,因此我可以查看并识别随时间重复的文件并确定要删除的文件。我有一个相当混乱的命令,充满了几个内部连接,我发现几年前我的MySQL服务器工作,但修改它到SQL Server还没有为我工作。任何人都知道有任何更简单的方法吗?下面是我正在尝试修改的MySQL命令。感谢

select [IGCSlidesDB].[dbo].[FilePath]
, [IGCSlidesDB].[dbo].[FileSize]
, [IGCSlidesDB].[dbo].[MD5] from [IGCSlidesDB].[dbo].[MD5Tool]
inner join ( select 
    [IGCSlidesDB].[dbo].[FilePath],
    [IGCSlidesDB].[dbo].[FileSize],
    [IGCSlidesDB].[dbo].[MD5] from [IGCSlidesDB].[dbo].[MD5Tool] group by [MD5] having count(*)>1) 
as t2 on ([IGCSlidesDB].[dbo].[MD5Tool].[MD5]=[t2].[MD5])
order by [IGCSlidesDB].[dbo].[MD5Tool].[FilePath];

3 个答案:

答案 0 :(得分:3)

试试这个:

;WITH CTE AS
(
    SELECT  *, 
            COUNT(*) OVER(PARTITION BY [MD5]) Total
    FROM [IGCSlidesDB].[dbo].[MD5Tool]
)
SELECT *
FROM CTE 
WHERE Total > 1

答案 1 :(得分:1)

如果我理解正确,对于复制的MD5Tool表中的每个MD5,您想要返回这些行吗?

尝试一下:

SELECT M.FilePath, M.FileSize, M.MD5
FROM MD5Tool M
INNER JOIN ( 
    SELECT MD5 FROM MD5Tool GROUP BY MD5 HAVING COUNT(*)>1
) M2 ON M.MD5 = M2.MD5
ORDER BY M.FilePath;

这是SQL Fiddle

祝你好运。

答案 2 :(得分:0)

另一种可能性:

select filepath, filesize, md5 
     from MD5Tool 
where md5 in 
     (select md5 from md5tool group by md5 having count(1) > 1)
order by filepath