2010-07-12 3 views
1

Допустит, у меня есть таблица, напримерSQL JOIN Заявление

Request No. Type Status 
--------------------------- 
1   New Renewed 

, а затем другой таблица

Action ID Request No LastUpdated  
------------------------------------ 
1   1   06-10-2010 
2   1   07-14-2010 
3   1   09-30-2010 

Как я могу присоединиться второй таблицей с первой таблицей, но только получить последнюю запись из второй таблицы (например Изменено DESC)

ответ

4
SELECT T1.RequestNo  , 
     T1.Type , 
     T1.Status, 
     T2.ActionId  , 
     T2.LastUpdated 
FROM TABLE1 T1 
     JOIN TABLE2 T2 
     ON  T1.RequestNo = T2.RequestNo 
WHERE NOT EXISTS 
     (SELECT * 
     FROM TABLE2 T2B 
     WHERE T2B.RequestNo = T2.RequestNo 
     AND  T2B.LastUpdated > T2.LastUpdated 
     ) 
+0

+1: Ты избил меня, чтобы опубликовать эту версию –

+0

СОВЕРШЕННО СПАСИБО! – Joe

+1

@ Joe: Я думаю, что Мартин Смит тоже заслуживает голосования –

2

Использование агрегатов:

SELECT r.*, re.* 
    FROM REQUESTS r 
    JOIN REQUEST_EVENTS re ON re.request_no = r.request_no 
    JOIN (SELECT t.request_no, 
       MAX(t.lastupdated) AS latest 
      FROM REQUEST_EVENTS t 
     GROUP BY t.request_no) x ON x.request_no = re.request_no 
           AND x.latest = re.lastupdated 

Использование LEFT JOIN & НЕ СУЩЕСТВУЕТ:

SELECT r.*, re.* 
    FROM REQUESTS r 
    JOIN REQUEST_EVENTS re ON re.request_no = r.request_no 
WHERE NOT EXISTS(SELECT NULL 
        FROM REQUEST_EVENTS re2 
        WHERE re2.request_no = r2.request_no 
         AND re2.LastUpdated > re.LastUpdated) 
0
SELECT r.RequestNo, r.Type, r.Status, a.ActionID, MAX(a.LastUpdated) 
FROM Request r 
INNER JOIN Action a ON r.RequestNo = a.RequestNo 
GROUP BY r.RequestNo, r.Type, r.Status, a.ActionID 
+0

Это даст вам максимальный LastUpdated но не ActionID что принадлежит то, что LastUpdated –

+0

D'oh. Мой мозг должен знать, что это выходные. –

1
SELECT * 
FROM REQUEST, ACTION 
WHERE REQUEST.REQUESTNO = ACTION.REQUESTNO --Joining here 
AND ACTION.LastUpdated = (SELECT MAX(LastUpdated) FROM ACTION WHERE REQUEST.REQUESTNO = ACTION.REQUESTNO); 

Суб-запрос используется для получения даты последнего обновленной записи и матчи против себя, чтобы предотвратить другие записи соединяемых ,

Предоставлено, в зависимости от того, насколько точным является поле LastUpdated, оно может иметь проблемы с обновлением двух записей в одну и ту же дату, но это проблема, встречающаяся в любой другой реализации, поэтому точность должна быть увеличена или другая логика должна быть на месте или другая отличительная характеристика для предотвращения повторения нескольких строк.

+1

Подзапрос не коррелирован - запрос будет использовать наивысшее последнее значение. –

+0

@OMG Ponies, который переводится на '09-30-2010', таким образом гарантируя, что только запись (или записи, если есть несколько в одну дату) будет объединена. – Nitrodist

+1

Итак, когда requestno не имеет записи, равной этой дате? ;) –

0

Мы можем использовать операцию Top 1 с предложением ORDER BY. Например, если ваши таблицы RequestTable (ID, тип, статус) и ActionTable (ActionID, RequestID, LastUpdated), запрос будет выглядеть следующим образом:

Select Top 1 rq.ID, rq.Status, at.ActionID 
From RequestTable as rq 
JOIN ActionTable as at ON rq.ID = at.RequestID 
Order by at.LastUpdated DESC 
Смежные вопросы