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

时间:2010-08-11 03:56:22

标签: sql database file md5 duplicate-data

这里有一点“特别”的时刻。基本上我有一个DB表来列出文件及其属性(大小,创建日期等)。作为一个自称为(临界妄想)的SQL-whiz,你可以想象我的惊喜,当我没有找到一个高质量的方式来单独列出[INSERT ATTRIBUTE HERE]多次出现的文件。

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

最佳。

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

select * 
 from @foo where FileNameOnDisk in (
     select FileNameOnDisk, count([INSERT_ATTRIBUTE_HERE]) as num from @foo 
     group by FileNameOnDisk 
     having num > 1
 )order by FileNameOnDisk

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:1)

我会用HAVING COUNT(someField)>来接近它。 1.这是使用FileName的示例,但您当然可以为MD5或日期时间字段修改它。

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