0

在这里有一个“特别”的时刻。基本上我有一个用于列出文件及其属性(大小、创建日期等)的数据库表。作为一个自称(边缘妄想)的 SQL 专家,当我未能找到一种质量方式来单独列出 [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
4

2 回答 2

1

我会用 HAVING COUNT(someField) > 1 来处理它。这是一个使用 FileName 的示例,但您当然可以为 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
于 2010-08-11T04:09:38.847 回答
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
于 2010-08-11T04:04:37.330 回答