2010-05-13 99 views
0

我有存儲過程,我試圖檢索由逗號分隔的用戶名字符串中列出的每個用戶完成的最後一張票。用戶可能沒有與他們關聯的票證,在這種情況下,我知道我只需要返回空值。那我一起工作的兩個表的定義如下:SQL Server 2008 - 更新臨時表

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不知道如何獲取更新語句中的最後一條記錄。

謝謝!

+0

是TicketID順序(即,每個用戶的最後一張門票是否也具有該用戶的任何門票的最高ID?)以及如何連接「Ticket」和「User」? 'AssignedTo'是否加入到'UserName'? – 2010-05-13 15:25:26

回答

1

一旦加載數據到#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 
+0

#票是空的,不是嗎? – 2010-05-13 15:31:04

+0

我假設他現有的代碼在此之前,但我會添加一個評論來說明這一點。 – egrunin 2010-05-13 15:57:06

1

我不認爲你需要臨時門票表在這種情況下。你只是想知道,「對於逗號分隔列表中的每個用戶,他們最近完成的門票(如果有的話)是什麼」。

因此,您需要爲每個用戶找出最近的門票,並且您希望確保外部連接的結果,所以如果用戶沒有門票,您仍然可以將其退回。

這是未經測試,但希望它給你的基本想法。

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;