我有这段代码:
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
错误
有什么建议吗?
答案 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'行。不确定它是否是最佳的,但现在可以使用。