(SQL) Wie kann ich Abfrage für eine Liste von Elementen, die Aktie Attribute, während die Zeilen unabhängig Einträge?
-
27-09-2019 - |
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
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