T-SQL返回MAX字段

时间:2017-10-05 13:35:42

标签: sql sql-server tsql ssms

我有这段代码:

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

现在,这会将UserID返回到某个项目的最新日志条目。我假设在加入另一个具有我加入的商品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

此代码会发生这样的情况:它会为修改Item的每个用户返回Max LogID,而不仅仅是我假设的最大LogID。我在这里缺少什么?

我还创建了一个标量函数,我在其中输入Log表LogID并返回userID并且可以工作,但是在运行它之后,它会减慢它的速度非常糟糕,而且我假设这是由于查询所有的加入ItemID的初始表中的LogID。

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

进一步说明:每当非系统用户(UserID <> 0)修改了项目时,日志表会保存新的LogID。

也尝试过:

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错误

有什么建议吗?

2 个答案:

答案 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 :(得分:1)

最后我想你可以在子查询中这样做:

SELECT TOP 1 * FROM ItemTable ORDER BY DESC

这抓住了我正在寻找的整个'LatestLog'行。不确定它是否是最佳的,但现在可以使用。