1

我有一个 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];
4

3 回答 3

3

尝试这个:

;WITH CTE AS
(
    SELECT  *, 
            COUNT(*) OVER(PARTITION BY [MD5]) Total
    FROM [IGCSlidesDB].[dbo].[MD5Tool]
)
SELECT *
FROM CTE 
WHERE Total > 1
于 2013-02-01T19:33:18.297 回答
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

祝你好运。

于 2013-02-01T19:29:38.703 回答
0

Another possibility:

select filepath, filesize, md5 
     from MD5Tool 
where md5 in 
     (select md5 from md5tool group by md5 having count(1) > 1)
order by filepath
于 2013-02-01T19:39:29.427 回答