我有一個表中的任務列表稱爲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
你想加入每個組的最新? – Mihai
@Mihai - 這將如何完成? – Craig
使用CTE,ROW_NUMBER()和JOIN。 –