(SQL) Wie kann ich Abfrage für eine Liste von Elementen, die Aktie Attribute, während die Zeilen unabhängig Einträge?

StackOverflow https://stackoverflow.com/questions/3455169

Frage

Nachdem hier ein bisschen von einem „besonderen“ Moment. Im Prinzip habe ich eine DB-Tabelle für Dateien und deren Attribute Listing (Größe, Erstellungsdatum, etc.). Als selbsternannter (Borderline-wahnhafte) SQL-Senkrechtstarter, können Sie sich meine Überraschung vorstellen, als ich, um herauszufinden, eine Qualität Art und Weise versagt, durch die einzeln Liste nur deren Dateien [INSERT ATTRIBUTE HIER] erschien mehrmals.

Zum Beispiel, sagen, dass ich alle Dateien, deren Dateigröße (oder Erstellungsdatum) sehen wollte, erschien mehr als einmal in der Tabelle, aber ich wollte noch separat ihnen aufgeführt. Oder eine noch bessere Anwendung: eine Gruppe von Dateien, die Aktie MD5-Hashes, sondern nur diejenigen, die mehrere Male (das heißt Duplikate) erscheinen, und ich möchte noch jede Datei unabhängig aufzulisten. Offensichtlich konnte ich Schleife durch die mehrfach DB, aber ich bin in einer einzigen Abfrage interessiert. Irgendwelche Gedanken?

Best.

[EDIT # 1 (Fehler in count)]

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
War es hilfreich?

Lösung

ich es mit dem HAVING COUNT (somefield) nähern würde> 1. Hier ist ein Beispiel Dateinamen, aber Sie können natürlich ändern es für den MD5 oder das Datetime-Feld.

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

Andere Tipps

Wenn ich Sie richtig verstehe, SQL Server verwenden Sie so etwas wie

versuchen können,
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
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top