У меня есть список задач в таблице под названием dbo.TaskINNER JOIN на Sub Query
В базе данных, каждая задача может иметь 1 или несколько строк в таблице 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, что неверно.
Edit:
На данный момент, это «Работа», как код ниже, но это кажется очень неэффективно, потому что для каждой строки задач, он должен работать два дополнительных запросов. И они оба на том же столе, только немного разные столбцы в этой таблице:
(выписка из колонок в SELECT, причины)
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:
Благодар идей и комментарии ниже, я закончил с этим, используя КТР:
;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. –