(SQL) Как мне запросить список элементов, которые имеют общие атрибуты, при этом перечисляя строки независимо? - PullRequest
0 голосов
/ 11 августа 2010

Здесь немного «особенного» момента. В основном у меня есть таблица БД для перечисления файлов и их атрибутов (размер, дата создания и т. Д.). Будучи самопровозглашенным (пограничным бредовым) SQL-одарением, вы можете себе представить мое удивление, когда мне не удалось выяснить, каким образом можно индивидуально составлять список только тех файлов, чья [INSERT ATTRIBUTE HERE] появлялась несколько раз.

Например, скажем, я хотел видеть все файлы, размер которых (или дата создания), которые встречались в таблице более одного раза, но я все же хотел, чтобы они были перечислены отдельно. Или даже лучшее приложение: группа файлов, которые совместно используют хеши MD5, но только те, которые появляются несколько раз (т.е. дублируются), и я все еще хочу перечислить каждый файл независимо. Очевидно, я мог бы пройтись по БД несколько раз, но меня интересует один запрос. Есть мысли?

Best.

[РЕДАКТИРОВАТЬ # 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 ]

1 голос
/ 11 августа 2010

Я бы подошел к этому с 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
1 голос
/ 11 августа 2010

Если я вас правильно понимаю, с помощью 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
...