在每个记录上调用SQL存储过程,需要基于集合的解决方案
我根据这篇文章中描述的光标创建了一个光标: 但我真正想要的是一个基于集合的解决方案。我有两张桌子,票和工作日志。 每个票证可以有多个工作日志,我只想要每个票证的最新工作日志在每个记录上调用SQL存储过程,需要基于集合的解决方案,sql,sql-server-2005,greatest-n-per-group,Sql,Sql Server 2005,Greatest N Per Group,我根据这篇文章中描述的光标创建了一个光标: 但我真正想要的是一个基于集合的解决方案。我有两张桌子,票和工作日志。 每个票证可以有多个工作日志,我只想要每个票证的最新工作日志 SELECT WorkLog.WorkLogDate, WorkLog.TextEntry, Ticket.ID, Ticket.Summary, Ticket.Requester, Ticket.Status, Ticket.Priority, Ticket.Assi
SELECT WorkLog.WorkLogDate, WorkLog.TextEntry, Ticket.ID,
Ticket.Summary, Ticket.Requester, Ticket.Status, Ticket.Priority,
Ticket.AssignedTo, Ticket.DateResolved, Ticket.TimeSpent
FROM Ticket INNER JOIN WorkLog ON Ticket.ID = WorkLog.TicketIDRef
如果我可以通过WorkLogID DESC从WorkLog ORDER中为票证中的每个票证.ID选择TOP(1)\u WorkLog,我将拥有我要寻找的集合。我看到一些类似的解决方案使用了交叉应用
,但我不确定需要应用什么函数
非常感谢您对我的帮助,让我的大脑摆脱OO状态。您所寻找的内容可以通过使用行数功能来实现
SELECT ROW_NUMBER() OVER (PARTITION BY Ticket.ID ORDER BY WorkLog.ID DESC) rowNumber,
WorkLog.WorkLogDate, WorkLog.TextEntry, Ticket.ID,
Ticket.Summary, Ticket.Requester, Ticket.Status, Ticket.Priority,
Ticket.AssignedTo, Ticket.DateResolved, Ticket.TimeSpent
FROM Ticket
INNER JOIN WorkLog ON Ticket.ID = WorkLog.TicketIDRef
WHERE rowNumber 1
有几种方法可以做到这一点 1) 不存在
SELECT WorkLog.WorkLogDate, WorkLog.TextEntry, Ticket.ID,
Ticket.Summary, Ticket.Requester, Ticket.Status, Ticket.Priority,
Ticket.AssignedTo, Ticket.DateResolved, Ticket.TimeSpent
FROM Ticket INNER JOIN WorkLog ON Ticket.ID = WorkLog.TicketIDRef
WHERE not exists (SELECT 1 FROM WorkLog w2 WHERE w2.TicketIDRef = Ticket.ID AND w2.WorkLogDate > WorkLog.WorkLogDate)
2) 子选择
SELECT
(
SELECT TOP 1
WorkLog.TextEntry
FROM
WorkLog
WHERE
Ticket.ID = WorkLog.TicketIDRef
ORDER BY
WorkLog.WorkLogDate DESC
) as TextEntry,
Ticket.ID,
Ticket.Summary, Ticket.Requester, Ticket.Status, Ticket.Priority,
Ticket.AssignedTo, Ticket.DateResolved, Ticket.TimeSpent
FROM Ticket
3) 加入
谢谢你,杰克!衡量每种解决方案性能的最简单方法是什么?我确信它们都比我的基于光标的解决方案性能更好!在SSM中,您可以查看其中每一个的执行计划,并查看其中哪一个执行更昂贵的操作。另外,只需在一个足够大的数据集上运行它们并比较响应时间应该是一个很好的指标!
SELECT WorkLog.WorkLogDate, WorkLog.TextEntry, Ticket.ID,
Ticket.Summary, Ticket.Requester, Ticket.Status, Ticket.Priority,
Ticket.AssignedTo, Ticket.DateResolved, Ticket.TimeSpent
FROM Ticket
INNER JOIN WorkLog ON Ticket.ID = WorkLog.TicketIDRef
INNER JOIN (
SELECT
max(WorkLogDate),
TicketIDRef
FROM
WorkLog w2
GROUP BY
TicketIDRef
) wMax ON
WorkLog.WorkLogDate = wMax.WorkLogDate AND
wMax.TicketIDRef = WorkLog.TicketIDRef