【问题标题】:(SQL) How do I query for a list of items that share attributes while listing the rows independently?(SQL) 如何在独立列出行的同时查询共享属性的项目列表?
【发布时间】:2011-03-28 04:16:10
【问题描述】:

在这里有一点“特别”的时刻。基本上我有一个用于列出文件及其属性(大小、创建日期等)的数据库表。作为一个自称(边缘妄想)的 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

【问题讨论】:

    标签: sql database file md5 duplicate-data


    【解决方案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
    

    【讨论】:

    • 天啊!我实际上有它,但我的问题是在第二部分查询计数:[SEE EDIT #1] ...有时我的大脑会这样打嗝,我想我实际上必须在查询中包含计数才能工作以后用它。不要问....谢谢你们!
    【解决方案2】:

    如果我理解正确,使用 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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-10-12
      • 1970-01-01
      • 1970-01-01
      • 2017-03-31
      • 1970-01-01
      • 1970-01-01
      • 2012-11-08
      相关资源
      最近更新 更多