2016-07-08 55 views
0

我一直試圖從數據庫中獲取一些數據,但當我只需要爲每個文件類型獲取最新的文件上載時就卡住了。在使用WHERE子句之前,我已經完成了這一步,但是這次需要一個額外的表來確定文件類型。SQL - 只選擇WHERE子句的最新記錄

我的查詢看起來像這樣到目前爲止,我得到這個用戶的六個記錄(2x filetypeNo4和4x filetypeNo2)。

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') 

我在WHERE子句這樣看這是不工作:

(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 
)) 

對不起我是一個小白所以這可能是很簡單,但我剛學這個東西,我去我的自己..

+1

請提供樣本數據和預期的結果.. –

+2

不直接關係到你的問題,但'留下了一個'WHERE db_applicationFileType.fileTypeID = db_applicationFiles.FiletypeID'將加入db_applicationFiles'將此表視爲「內連接」。不知道這是你想要的。 – ughai

回答

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') 

而且它看起來像所有的加入實際上是INNER。除非有沒有文件的配置文件(這就是爲什麼OUTER而不是CROSS)。

0

什麼明顯的:

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

這段代碼實際上並不是很明顯。不知道這是否會發生100%,但是優化器可能會完全忽略_subquery_中的'order by'而沒有_top_。 –