2010-08-11 22 views
0

Avoir un peu un moment "spécial" ici. Fondamentalement, j'ai une table DB pour la liste des fichiers et leurs attributs (taille, date de création, etc). Étant un SQL-whiz autoproclamé (délirant borderline), vous pouvez imaginer ma surprise quand je n'ai pas réussi à trouver une façon de classer individuellement les fichiers dont [INSERT ATTRIBUTE HERE] est apparu plusieurs fois. Par exemple, disons que je voulais voir tous les fichiers dont la taille de fichier (ou la date de création) est apparue plus d'une fois dans la table, mais je voulais quand même qu'ils soient listés séparément. Ou une application encore meilleure: un groupe de fichiers qui partagent des hachages MD5, mais seulement ceux qui apparaissent plusieurs fois (c'est-à-dire des doublons), et je veux toujours lister chaque fichier indépendamment. Évidemment, je pourrais parcourir la base de données plusieurs fois, mais je suis intéressé par une seule requête. Des pensées?(SQL) Comment rechercher une liste d'éléments partageant des attributs tout en listant les lignes indépendamment?

Meilleur.

[EDIT # 1 (erreur de comptage)]

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 

Répondre

1

J'approche avec having COUNT (someField)> 1. Voici un exemple utilisant FileName, mais vous pouvez bien sûr le modifier pour le champ MD5 ou 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 
+0

D'oh! Je l'avais en fait, mais mon problème était de demander le compte dans la deuxième partie: [VOIR EDIT # 1] ... parfois mon cerveau hoquète comme ça et je pense que je dois réellement inclure le nombre dans la requête afin de travailler avec plus tard. Ne demandez pas .... Merci à vous deux! –

1

Si je vous comprends bien, en utilisant Sql Server, vous pouvez essayer quelque chose comme

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