2012-10-06 5 views
1

J'ai une requête SQL pour une table dans laquelle l'utilisateur peut créer plusieurs 'révisions' d'un formulaire. Actuellement, nous passons l'ID de la révision dans la requête pour récupérer les valeurs (comme vous pouvez probablement le deviner), ce qui est bien - mais je veux étendre pour sélectionner également les lignes de révisions précédentes (s'il s'agit d'une révision précédente). Chaque révision a un nombre qui est incrémenté quand ils créent une nouvelle révision. semble Voici ma requête à ce jour qui ne pas courir (évidemment la valeur 1, la valeur 2 sont les colonnes réelles dans ma requête)SQL - Table dérivée joignant

SELECT ID, SageJobID, SageJobPK, DateID, Revision, StatusID, Value1, Value2 
FROM CVRs 
LEFT OUTER JOIN (SELECT TOP(1) * 
        FROM CVRs AS prevCVR 
        WHERE (prevCVR.DateID = CVRs.DateID 
        AND prevCVR.SageJobPK = CVRs.SageJobPK 
        AND prevCVR.ID <> CVRs.ID) 
        ORDER BY prevCVR.Revision DESC) AS 'PrevCVR' 
WHERE  (CVRs.ID = @ID) 

Il semble que je ne peux pas accéder à la ligne principale de CVR je sélectionne de ma part. Des idées?

+2

Veuillez marquer votre SGBDR et votre version lorsque vous posez des questions SQL. Je suppose que SQL Server de "TOP" –

Répondre

1

J'ai fait une Fiddle SQL avec une version simplifiée pour vous donner une idée de comment vous pouvez le résoudre. SQL Fiddle Demo here

Ce serait alors sur ce

SELECT ID, SageJobID, SageJobPK, DateID, Revision, StatusID, Value1, Value2 
FROM CVRs 
WHERE DateId in (select dateid from cvrs where CVRs.ID = @ID) 
    and sagejobpk in (select sagejobpk from cvrs where CVRs.ID = @ID) 
order by revision desc 

Edit: J'ai fait une autre SQL Fiddle aussi prendre l'aspect DateId dans mais j'ai une question: Est-ce que toutes les révisions de CV qui appartiennent ensemble doivent être identiques DateId et SageJobPK?

0

Vous avez besoin du OUTER APPLY plutôt que OUTER JOIN

SELECT CVRs.*, 
     PrevCVR.* /*TODO: Select desired columns*/ 
FROM CVRs 
     OUTER APPLY (SELECT TOP(1) * 
        FROM CVRs AS prevCVR 
        WHERE (prevCVR.DateID = CVRs.DateID 
          AND prevCVR.SageJobPK = CVRs.SageJobPK 
          AND prevCVR.ID <> CVRs.ID) 
        ORDER BY prevCVR.Revision DESC) AS PrevCVR 
WHERE (CVRs.ID = @ID) 
0
SELECT a.ID, a.SageJobID, a.SageJobPK, a.DateID, a.Revision, a.StatusID, a.Value1, a.Value2 
FROM CVRs as a 
LEFT OUTER JOIN CVRs as b 
on .DateID = b.DateID AND a.SageJobPK = b.SageJobPK AND a.ID <> b.ID 
where a.ID = @ID ORDER BY b.Revision DESC 
0

Je pense que la meilleure façon d'obtenir plusieurs révisions les plus récentes utilise les fonctions de classement:

select SageJobID, SageJobPK, DateID, Revision, StatusID, Value1, Value2 
from (select CVR.*, 
      row_number() over (partition by id order by revision desc) as seqnum 
     from CVRs 
    ) c 
where c.ID = @ID and seqnum <= 2 
order by revision desc 

commandes SEQNUM les révisions, en affectant 1 à la plus récente, 2 à la deuxième la plus récente, et ainsi sur.

Questions connexes