1

ユーザーがフォームの複数の「リビジョン」を作成できるテーブルの SQL クエリがあります。現在、リビジョンの ID をクエリに渡して値を取得します (おそらくご想像のとおり)。これで問題ありませんが、以前のリビジョンの行も選択できるように拡張したいと考えています (以前のリビジョンの場合)。各リビジョンには、新しいリビジョンを作成するときに増加する番号があります。これまでのところ、実行されていないように見えるクエリがあります(明らかに、値1、値2はクエリの実際の列です)

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)

結合から選択しているメインの CVR 行にアクセスできないようです。何か案は?

4

4 に答える 4

1

簡略化されたバージョンのSQLFiddleを作成して、それを解決する方法を説明しました。SQLフィドルデモはこちら

それはこれについてです

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

編集:私は別のSQLフィドルを作成してその側面も取り入れましDateIdたが、質問がありました:一緒に属するすべてのCVリビジョンは同じDateIdでなければなりませんSageJobPKか?

于 2012-10-06T13:14:53.333 に答える
0

複数の最新リビジョンを取得する最も簡単な方法は、ランキング機能を使用することだと思います。

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

Seqnum は、最新のものに 1、2 番目に新しいものに 2 というように割り当てて、リビジョンを並べ替えます。

于 2012-10-06T16:29:03.283 に答える
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
于 2012-10-06T12:56:08.327 に答える
0

OUTER APPLYではなく必要なようです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 ) 
于 2012-10-06T12:52:14.653 に答える