2010-07-12 5 views
1

는 내가 첫 번째 테이블에 두 번째 테이블을 조인하지만 단지에서 최신 기록을 얻을 수있는 방법 테이블 예를 들어SQL 문

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 
좌 & 가입하여

는 NOT EXISTS :

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 Ponyies '09-30-2010'으로 번역되므로 동일한 날짜에 여러 개의 레코드가있는 경우 레코드 만 조인됩니다. – Nitrodist

+1

그러면 requestno에 해당 날짜와 동일한 항목이 없을 때? ;) –

0

ORDER BY 절과 함께 Top 1 연산을 사용할 수 있습니다. 테이블이 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