2010-07-12 134 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