(SQL)如何在单独列出行的同时查询共享属性的项目列表?

(SQL)如何在单独列出行的同时查询共享属性的项目列表?,sql,database,file,md5,duplicate-data,Sql,Database,File,Md5,Duplicate Data,这里有一点“特别”的时刻。基本上,我有一个DB表,用于列出文件及其属性(大小、创建日期等)。作为一个自称的(近乎妄想的)SQL高手,你可以想象当我无法找到一种高质量的方式来单独列出[INSERT ATTRIBUTE HERE]出现多次的文件时,我会感到惊讶 例如,假设我想查看其文件大小(或创建日期)在表中多次出现的所有文件,但我仍然希望它们单独列出。或者是一个更好的应用程序:一组共享MD5哈希值的文件,但只有那些多次出现的文件(即重复文件),我仍然希望单独列出每个文件。显然,我可以多次遍历数据库

这里有一点“特别”的时刻。基本上,我有一个DB表,用于列出文件及其属性(大小、创建日期等)。作为一个自称的(近乎妄想的)SQL高手,你可以想象当我无法找到一种高质量的方式来单独列出[INSERT ATTRIBUTE HERE]出现多次的文件时,我会感到惊讶

例如,假设我想查看其文件大小(或创建日期)在表中多次出现的所有文件,但我仍然希望它们单独列出。或者是一个更好的应用程序:一组共享MD5哈希值的文件,但只有那些多次出现的文件(即重复文件),我仍然希望单独列出每个文件。显然,我可以多次遍历数据库,但我对单个查询感兴趣。有什么想法吗

最好的

[编辑#1(计数错误)]


如果我理解正确,使用Sql Server您可以尝试以下操作

DECLARE @Table TABLE(
        ID INT IDENTITY(1,1),
        FullFileName VARCHAR(500),
        DateCreated DATETIME,
        FileSize INT
)

INSERT INTO @Table (FullFileName, DateCreated, FileSize) 
SELECT 'a','01 Jan 2000',10
INSERT INTO @Table (FullFileName, DateCreated, FileSize) 
SELECT 'b','02 Jan 2000',1000
INSERT INTO @Table (FullFileName, DateCreated, FileSize) 
SELECT 'c','01 Jan 2000',100
INSERT INTO @Table (FullFileName, DateCreated, FileSize) 
SELECT 'd','03 Jan 2000',10

SELECT  t.*
FROM    @Table t INNER JOIN
        (
            SELECT  FileSize
            FROm    @Table
            GROUP BY FileSize
            HAVING COUNT(ID) > 1
        ) FileSizes ON  t.FileSize = FileSizes.FileSize

我会让COUNT(someField)>1。下面是一个使用文件名的示例,但是您当然可以为MD5或datetime字段修改它

declare @foo table (FileNameOnDisk varchar(100), MD5Hash varchar(100), CreatedOn smalldatetime)

INSERT Into @foo (FileNameOnDisk, MD5Hash, CreatedOn)
 VALUES ('foo', 'abc123', 'jan 1 2010'),
  ('bar', 'abc123', 'aug 1 2010'),
  ('ar', 'ajkfsd43', 'nov 1 2010'),
  ('baz', '44', 'sep 1 2010'),
  ('foo', 'abc123', 'aug 1 2010'),
  ('baz', '44', 'jan 1 2010')

 select * 
 from @foo where FileNameOnDisk in (
     select FileNameOnDisk from @foo 
     group by FileNameOnDisk 
     having COUNT(FileNameOnDisk) > 1
 )order by FileNameOnDisk

哦!我确实有过,但我的问题是在第二部分中查询计数:[见编辑#1]…有时我的大脑会像那样打嗝,我想我实际上必须在查询中包含计数,以便以后处理它。不要问。。。。谢谢你们两个!
declare @foo table (FileNameOnDisk varchar(100), MD5Hash varchar(100), CreatedOn smalldatetime)

INSERT Into @foo (FileNameOnDisk, MD5Hash, CreatedOn)
 VALUES ('foo', 'abc123', 'jan 1 2010'),
  ('bar', 'abc123', 'aug 1 2010'),
  ('ar', 'ajkfsd43', 'nov 1 2010'),
  ('baz', '44', 'sep 1 2010'),
  ('foo', 'abc123', 'aug 1 2010'),
  ('baz', '44', 'jan 1 2010')

 select * 
 from @foo where FileNameOnDisk in (
     select FileNameOnDisk from @foo 
     group by FileNameOnDisk 
     having COUNT(FileNameOnDisk) > 1
 )order by FileNameOnDisk