2010-07-12 8 views
1

permet de dire que j'ai une table par exempleSQL JOIN

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

puis une autre table

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

Comment puis-je joindre à la deuxième table avec la première table, mais seulement obtenir le dernier enregistrement de la deuxième table (par exemple Dernière mise à jour DESC)

Répondre

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: Vous me battez pour poster cette version –

+0

MERCI PARFAIT! – Joe

+1

@Joe: Je pense que Martin Smith mérite un vote aussi –

2

agrégats Utilisation:

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 

Utiliser LEFT JOIN & EXISTE PAS:

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

Cela vous donnera le maximum LastUpdated mais pas le ActionID que appartient que LastUpdated –

+0

D'oh. Mon cerveau doit savoir que c'est le week-end. –

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); 

Une sous-requête est utilisée pour obtenir la dernière date de dossier mis à jour et correspond contre lui-même pour éviter que les autres documents étant joints . Certes, en fonction de la précision du champ LastUpdated, il peut y avoir des problèmes avec deux enregistrements mis à jour à la même date, mais c'est un problème rencontré dans toute autre implémentation, donc la précision devrait être augmentée ou une autre logique devrait être en place ou une autre caractéristique distinctive pour empêcher le retour de plusieurs lignes.

+1

La sous-requête n'est pas corrélée - la requête va utiliser la valeur lastupdated la plus élevée. –

+0

@OMG Poneys Ce qui se traduirait par '09-30-2010', assurant ainsi que seul l'enregistrement (ou les enregistrements s'il y en a plusieurs à la même date) sera joint. – Nitrodist

+1

Donc, quand un requestno n'a pas une entrée égale à cette date? ;) –

0

Nous pouvons utiliser l'opération Top 1 avec la clause ORDER BY. Par exemple, si vos tables sont RequestTable (ID, Type, État) et ActionTable (ActionID, RequestID, LastUpdated), la requête sera comme ceci:

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