2017-10-05 116 views
1

我有這樣的代碼:T-SQL返回MAX場

SELECT ItemID, UserID, MAX(LogID) AS 'LatestLog' 
FROM Log 
WHERE UserID <> 0 
GROUP BY ItemID, UserID` 

現在這個返回用戶ID爲某一個項目的最新日誌條目。我相信它會做同樣加入到另一個表有說我加盟到,像這樣的項目ID時:這個代碼會發生什麼

SELECT it.ItemID, it.ItemName, UA.UserID 
FROM ItemTable it LEFT JOIN 
    (SELECT ItemID, UserID, MAX(LogID) AS 'LatestLog' 
     FROM Log 
     WHERE UserID <> 0 
     GROUP BY LogID, UserID 
    ) AS UA 
    ON it.ItemID = UA.ItemID 

是返回的最大LogIDs爲每個修改Item的用戶,而不僅僅是我認爲的最大LogID。我在這裏錯過了什麼?

我還創建了一個標量函數,我將輸入日誌表LogID並返回用戶ID並工作,但運行後,它減慢它非常糟糕,我假設這是由於查詢所有LogID的從初始表加入ItemID。

DECLARE @UID INT 
SELECT @UID = al.UserID FROM Log al WHERE al.LogID = @theID 
RETURN @UID 

並使用它像這樣:

SELECT ItemID, ItemName, UDFGetModBy(MAX(UA.LogID)) FROM ItemTable it 
LEFT JOIN (SELECT ItemID, UserID, MAX(LogID) AS 'LatestLog' FROM Log WHERE UserID <> 0 
GROUP BY LogID, UserID) AS UA ON it.ItemID = UA.ItemID 

項目表架構組成:ItemID, ItemName, CreatedDate
日誌表架構組成:LogID, ItemID (FK to Item Table), DateModified, UserID

預期的輸出應該是:it.ItemID, it.ItemName, al.UserID, al.DateModified

進一步說明:日誌表每次都會保存一個新的LogID em已被非系統用戶修改(UserID <> 0)。

也試過:

SELECT it.ItemID, it.ItemName, UID = 
(SELECT al.UserID, MAX(al.LogID) AS 'LID' FROM Log al) 
WHERE al.UserID <> 0 AND it.ItemID = al.ItemID) 
FROM ItemTable it 

但我得到一個 only one expression can be specified in the select list when the subquery is not introduced with EXISTS錯誤

任何建議嗎?

+3

分享'Item'和'Log'表'Schema'和'Data'。和預期的'輸出'。 –

+0

我不確定你需要一個派生表來做到這一點。它會減慢速度,你在函數中逐個執行它,並將它從基於設置的位置上移開。 – Leonidas199x

+0

我試着回答,但意識到我們首先需要您的表格定義。 –

回答

1

您需要篩選select中的數據。這樣的東西(這裏沒有sql):

SELECT ItemID, ItemName, UDFGetModBy(MAX(UA.LogID)) FROM ItemTable it 
OUTER APPLY (SELECT ItemID, UserID, MAX(LogID) AS 'LatestLog' FROM Log WHERE 
UserID <> 0 and ItemID = it.ItemID GROUP BY ItemID, UserID) 

使用外部應用你可以過濾子查詢中的數據。

1

最後我想你可以做這樣的子查詢:

SELECT TOP 1 * FROM ItemTable ORDER BY DESC 

這抓住了整個「LatestLog」行我一直在尋找。不知道它是否是最佳的,但它現在起作用。