Оператор SQL JOIN - PullRequest
       2

Оператор SQL JOIN

1 голос
/ 12 июля 2010

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

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)

Ответы [ 5 ]

4 голосов
/ 12 июля 2010
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
       )
2 голосов
/ 12 июля 2010

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

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

Используя левое соединение и не существует:

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)
1 голос
/ 12 июля 2010
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,у него могут быть проблемы с обновлением двух записей в одну и ту же дату, но это проблема, с которой сталкиваются в любой другой реализации, поэтому точность должна быть увеличена, или должна быть какая-то другая логика или другая отличительная характеристика, чтобы предотвратитьвозвращаемые строки.

0 голосов
/ 12 июля 2010

Мы можем использовать операцию Top 1 с предложением ORDER BY.Например, если ваши таблицы - это RequestTable (ID, Type, Status) и 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
0 голосов
/ 12 июля 2010
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
...