2013-12-17 4 views
1

У меня есть список задач в таблице под названием 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 
+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 является необязательным, но используется для начала нумерации для каждого значения в этой группе, то есть: если вы указали PARTITION BY Some_Date, то для каждого уникального значения даты нумерация начнется с 1. ORDER BY, конечно, используется, чтобы определить, как должен идти счет, и требуется в функции ROW_NUMBER().

Возможно, вам потребуется отрегулировать PARTITION BY в соответствии с вашим запросом, запустите подзапрос самостоятельно, чтобы получить представление о том, как работает ROW_NUMBER().