2013-12-17 64 views
1

我有一個表中的任務列表稱爲dbo.Task內部加入的子查詢

在數據庫中,每個任務可以在TaskLine表中有一個或多個行。

TaskLine有一個將任務線關聯到任務的TaskID。

一個TaskLine有一個名爲TaskHeadingTypeID

我需要返回所有的任務欄,加入到該任務的最後TaskLine。

在英語中,我需要顯示一個任務,並帶有最新的TaskLine標題。所以,我基本上需要加入到TaskLine表,這樣的(這是不正確的,也許低效,但希望顯示什麼,我試圖做)

SELECT * 
    FROM @Results r 
    INNER JOIN (
     SELECT TOP 1 TaskID, TaskHeadingTypeID FROM dbo.TaskLine 
     ORDER BY TaskLineID DESC 
    ) tl 
     ON tl.TaskID = r.TaskID 

然而,問題是,只有子查詢帶回最後一個TaskLine行,這是不正確的。

編輯:

目前,它的「工作」像下面的代碼,但它似乎是非常低效的,因爲每個任務行,它具有運行兩個額外的查詢。而且他們都在同一個表,只要稍微不同的列在表:

SELECT TaskStatusID, 
    TaskStatus, 
    (SELECT TOP 1 TaskHeadingTypeID FROM dbo.TaskLine 
    WHERE TaskID = r.TaskID 
    ORDER BY TaskLineID DESC) AS TaskHeadingID, 
    (SELECT TOP 1 LongName FROM dbo.TaskLine tl 
    INNER JOIN ref.TaskHeadingType tht 
     ON tht.TaskHeadingTypeID = tl.TaskHeadingTypeID 
    WHERE TaskID = r.TaskID 
    ORDER BY TaskLineID DESC) AS TaskHeading, 
    PersonInCareID, 
    ICMSPartyID, 
    CarerID.... FROM... 

EDIT(在SELECT原因列的提取物):

得益於思路以下評論,我已經結束了這一點,利用CTE:

;WITH ValidTaskLines (RowNumber, TaskID, TaskHeadingTypeID, TaskHeadingType) 
    AS 
    (SELECT 
     ROW_NUMBER()OVER(PARTITION BY tl.TaskID, tl.TaskHeadingTypeID ORDER BY tl.TaskLineID) AS RowNumber, 
     tl.TaskID, 
     tl.TaskHeadingTypeID, 
     LongName AS TaskHeadingType 
     FROM dbo.TaskLine tl 
     INNER JOIN ref.TaskHeadingType tht 
     ON tht.TaskHeadingTypeID = tl.TaskHeadingTypeID 
    ) 

    SELECT AssignedByBusinessUserID, 
     BusinessUserID, 
     LoginName, 
     Comments, 
     r.CreateDate, 
     r.CreateUser, 
     r.Deleted, 
     r.Version, 
     IcmsBusinessUserID, 
     r.LastUpdateDate, 
     r.LastUpdateUser, 
     OverrrideApprovalBusinessUserID, 
     PlacementID, 
     r.TaskID, 
     TaskPriorityTypeID, 
     TaskPriorityCode, 
     TaskPriorityType, 
      TaskStatusID, 
     TaskStatus, 
     vtl.TaskHeadingTypeID AS TaskHeadingID, 
     vtl.TaskHeadingType AS TaskHeading, 
     PersonInCareID, 
     ICMSPartyID, 
     CarerID, 
     ICMSCarerEntityID, 
     StartDate, 
     EndDate 
    FROM @Results r 
    INNER JOIN ValidTaskLines vtl 
    ON vtl.TaskID = r.TaskID 
    AND vtl.RowNumber = 1 
+0

你想加入每個組的最新? – Mihai

+0

@Mihai - 這將如何完成? – Craig

+0

使用CTE,ROW_NUMBER()和JOIN。 –

回答

1

你可以使用這個功能ROW_NUMBER()

SELECT * 
FROM @Results r 
INNER JOIN (SELECT TaskID 
       , TaskHeadingTypeID 
       , ROW_NUMBER()OVER(PARTITION BY TaskID, TaskHeadingTypeID ORDER BY TAskLineID DESC) RN 
      FROM dbo.TaskLine 
      ) tl 
ON tl.TaskID = r.TaskID 
AND t1.RN = 1 

ROW_NUMBER()函數爲每一行分配一個數字。 PARTITION BY是可選的,但用於開始對該組中的每個值進行編號,即:如果對於每個唯一日期值,編號將從1開始。當然,ORDER BY用於定義計數應該如何進行,並且在ROW_NUMBER()功能中是必需的。

您可能需要調整PARTITION BY以適合您的查詢,請自行運行子查詢以瞭解ROW_NUMBER()的工作原理。