SQL Server 2008 - обновить временную таблицу - PullRequest
0 голосов
/ 13 мая 2010

У меня есть хранимая процедура, в которой я пытаюсь получить последний тикет, заполненный каждым пользователем, указанным в строке имен пользователей, разделенных запятыми. У пользователя может не быть связанного с ним билета, в этом случае я знаю, что мне просто нужно вернуть ноль. Две таблицы, с которыми я работаю, определены следующим образом:

User
----
UserName,
FirstName,
LastName

Ticket
------
ID,
CompletionDateTime,
AssignedTo,
AssignmentDate,
StatusID

TicketStatus
------------
ID,
Comments

Я создал хранимую процедуру, в которой я пытаюсь вернуть последний заполненный тикет для списка имен пользователей, разделенных запятыми. Каждая запись должна включать комментарии, связанные с ней. В настоящее время я пробую следующее:

CREATE TABLE #Tickets
(
  [UserName] nvarchar(256),
  [FirstName] nvarchar(256),
  [LastName] nvarchar(256),
  [TicketID] int,
  [DateCompleted] datetime,
  [Comments] text
)

-- This variable is actually passed into the procedure
DECLARE @userList NVARCHAR(max)
SET @userList='user1,user2,user2'

-- Obtain the user information for each user
INSERT INTO #Tickets
(
  [UserName],
  [FirstName],
  [LastName]
)
SELECT
  u.[UserName],
  u.[FirstName],
  u.[LastName]
FROM
  User u 
    INNER JOIN dbo.ConvertCsvToTable(@userList) l ON u.UserName=l.item

На данный момент у меня есть имя пользователя, имя и фамилия для каждого переданного пользователя. Однако я не знаю, как на самом деле получить последний билет для каждого из этих пользователей.

Как мне это сделать? Я считаю, что я должен обновить временную таблицу, которую я создал. В то же время, id не знает, как получить только последнюю запись в операторе обновления.

Спасибо!

Ответы [ 2 ]

1 голос
/ 13 мая 2010

Не думаю, что в этом случае вам нужна временная таблица Tickets. Вам просто нужно знать: «Для каждого пользователя в списке, разделенном запятыми, каким был его последний заполненный билет (если есть)».

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

Это не проверено, но, надеюсь, оно даст вам основную идею.

    SELECT u.UserName
         , u.FirstName
         , u.LastName
         , t.ID
         , t.CompletionDateTime
         , t.AssignedTo
         , t.AssignmentDate
         , t.StatusID
      FROM dbo.User u INNER JOIN dbo.ConvertCsvToTable(@userList) ON u.UserName=l.item
   LEFT OUTER JOIN
          (SELECT t.AssignedTo
                , MAX(t.CompletionDateTime) CompletionDateTime)
             FROM Ticket t
         GROUP BY t.AssignedTo) t
    ON t.AssignedTo = u.UserName;
1 голос
/ 13 мая 2010

После того, как вы загрузили данные в #tickets (как это делает ваш пример), этот запрос даст вам самое последнее для каждого имени пользователя:

select * from #tickets x
inner join
(select username, max(DateCompleted) as theDate 
    from #tickets group by username) y
ON x.username = y.username, x.DateCompleted = y.theDate
...