1

ファイルのメタデータをテーブルに格納するSQLサーバー(2008 R2)があります。各ファイルには独自の行があり、各ファイルにはMD5が計算されて保存されています。サーバーでMD5値が複数回発生するファイルのリストを印刷したいので、時間の経過とともに複製されたファイルを調べて特定し、削除するファイルを決定できます。数年前からMySQLサーバーで機能することがわかった、いくつかの内部結合でいっぱいのかなり厄介なコマンドがありますが、SQLServerに変更してもまだ機能していません。これを行う簡単な方法を知っている人はいますか?以下は、私が試していた変更された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;

そして、これがSQLFiddleです。

幸運を。

于 2013-02-01T19:29:38.703 に答える
0

別の可能性:

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 に答える