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