2016-07-08 18 views
0

Ich habe versucht, einige Daten aus unserer Datenbank zu bekommen, aber stecken geblieben, wenn ich nur die neueste Datei hochladen musste für jeden Dateityp. Ich habe dies getan, bevor ich die WHERE-Klausel verwende, aber dieses Mal ist eine zusätzliche Tabelle beteiligt, die benötigt wird, um den Dateityp zu bestimmen.SQL - Wählen Sie nur den neuesten Datensatz mit WHERE-Klausel

Meine Abfrage sieht so weit und ich bekomme sechs Datensätze für diesen Benutzer (2x DateitypNo4 und 4x DateitypNo2).

SELECT db_file.fileID 
    ,db_profile.NAME 
    ,db_applicationFileType.fileTypeID 
    ,> db_file.dateCreated 
FROM db_file 
LEFT JOIN db_applicationFiles 
    ON db_file.fileID = db_applicationFiles.fileID 
LEFT JOIN db_profile 
    ON db_applicationFiles.profileID = db_profile.profileID 
LEFT JOIN db_applicationFileType 
    ON db_applicationFiles.fileTypeID = > > db_applicationFileType.fileTypeID 
WHERE db_profile.profileID IN ('19456') 
    AND db_applicationFileType.fileTypeID IN ('2','4') 

Ich habe die Klausel WHERE so aussieht, die nicht funktioniert:

(db_file.dateCreated IS NULL 
OR db_file.dateCreated = (
    SELECT MAX(db_file.dateCreated) 
    FROM db_file left join 
db_applicationFiles on db_file.fileID = db_applicationFiles.fileID 
    WHERE db_applicationFileType.fileTypeID = db_applicationFiles.FiletypeID 
)) 

Sorry, ich bin ein noob so kann dies sehr einfach sein, aber ich lerne gerade dieses Zeug, wie ich gehe auf meine besitzen ..

+1

Bitte geben Datenabtastwert und erwartetes Ergebnis .. –

+2

auf Ihre Frage nicht direkt, sondern 'LEFT JOIN db_applicationFiles' mit einer WHERE db_applicationFileType.fileTypeID = db_applicationFiles.FiletypeID' wird Behandle diese Tabelle als 'innere Verbindung'. Nicht sicher, ob dies das ist, was Sie wollen. – ughai

Antwort

0
SELECT 
    ff.fileID, 
    pf.NAME, 
    ff.fileTypeID, 
    ff.dateCreated 
FROM db_profile pf 
OUTER APPLY 
(
    SELECT TOP 1 af.fileTypeID, df.dateCreated, df.fileID 
    FROM db_file df 
    INNER JOIN db_applicationFiles af 
    ON df.fileID = af.fileID 
    WHERE af.profileID = pf.profileID 
    AND af.fileTypeID IN ('2','4') 
    ORDER BY create_date DESC 
) ff 
WHERE pf.profileID IN ('19456') 

Und es sieht aus wie alle Ihre schließt sich tatsächlich INNER sind. Es sei denn, es gibt Profile ohne Dateien (deshalb gilt OUTER anstelle von CROSS).

0

Was ist ein offensichtlicher:

SELECT * FROM 
    (SELECT * FROM db_file ORDER BY dateCreated DESC) AS files1 
GROUP BY fileTypeID ; 
+0

Der Punkt dieses Codes ist eigentlich nicht sehr offensichtlich. Nicht sicher, ob dies für 100% passieren wird, aber der Optimierer ignoriert diese Reihenfolge in _subquery_ ohne _top_. –

Verwandte Themen