Для вызова хранимой процедуры SQL для каждой записи необходимо решение на основе набора - PullRequest
0 голосов
/ 28 декабря 2011

Я создал курсор из того, который был описан в этом посте: SQL - вызов хранимой процедуры для каждой записи

Но что я действительно хочу, так это решение на основе множеств. У меня есть две таблицы, билеты и рабочие журналы. Каждый Билет может иметь несколько рабочих журналов, я просто хочу самый последний для каждого билета.

 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

Если бы я мог как-то SELECT TOP (1) _WorkLog_ FROM WorkLog ORDER BY WorkLogID DESC для каждого Ticket.ID в Билеты, у меня был бы набор, который я ищу. Я видел некоторые похожие решения, использующие CROSS APPLY, но я не уверен, какую функцию мне нужно применить.

Любая помощь в освобождении моего мозга от ОО снаряжения очень ценится.

Ответы [ 2 ]

1 голос
/ 28 декабря 2011

Есть несколько способов сделать это.

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) Присоединения

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
0 голосов
/ 28 декабря 2011

То, что вы ищете, может быть достигнуто с помощью функции row_number

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
...