2010-07-12 141 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:你打我發佈此版本 – 2010-07-12 01:52:00

+0

完美謝謝! – Joe 2010-07-12 02:00:52

+1

@Joe:我認爲馬丁史密斯也值得一票 – 2010-07-12 02:02:48

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 & 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 – 2010-07-12 01:48:25

+0

D'oh。我的大腦必須知道這是週末。 – 2010-07-12 01:58:47

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

子查詢不相關 - 查詢將使用最新的lastupdated值。 – 2010-07-12 02:11:34

+0

@OMG小馬將翻譯爲'09-30-2010',從而確保只有記錄(或記錄,如果在同一天有多個記錄)將被加入。 – Nitrodist 2010-07-12 02:18:39

+1

所以當一個requestno沒有一個條目等於那個日期? ;) – 2010-07-12 02:21:07

0

我們可以使用操作Top 1和ORDER BY子句。舉例來說,如果你的表是RequestTable(ID,類型,狀態)和ActionTable(ActionID,請求ID,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