3

これは私が以前に尋ねた別の質問に関連しています。すばやくスキャンすると、これをよりよく理解できる可能性があります。 バージョン番号float、decimal、またはdouble

データベーステーブルに2つの列と1つの外国語があります。[バージョン]列と[改訂]列。これらはバージョン番号に関連しています。例:バージョン1、リビジョン2 = v1.2

私がする必要があるのは、特定の外部キーの最大バージョン番号を取得することです。

これが私がこれまでに持っているものです:

SELECT f.[pkFileID]
   ,x.[fkDocumentHeaderID]
   ,f.[fkDocumentID]
   ,x.[Version]
   ,x.[Revision]
   ,f.[FileURL]
   ,f.[UploadedBy]
   ,f.[UploadedDate]
FROM 
(
     SELECT 
     docs.[fkDocumentHeaderID]
     ,MAX([Version]) AS Version
     ,MAX([Revision]) AS Revision
 FROM 
     [ClinicalGuidanceV2].[dbo].[tbl_DocumentFiles]
 INNER JOIN 
     dbo.tbl_Documents docs ON [fkDocumentID] = [pkDocumentID]
 GROUP BY
     docs.[fkDocumentHeaderID]
)
AS x
INNER JOIN
 dbo.tbl_DocumentFiles f ON 
 f.[fkDocumentHeaderID] = x.[fkDocumentHeaderID] AND 
 f.[Version] = x.[Version] AND
 f.[Revision] = x.[Revision]

基本的に最大値を取得し、それ自体に参加します。バージョン番号1.11.2あり2.0、上記のクエリから返される最大値は2.2(存在しない)であるため、これは明らかに機能しません。

私がする必要があるのは(私が思うに)最大の[バージョン]を選択し、次にその[バージョン]の最大の[リビジョン]を選択することですが、これを行う方法がよくわかりません。

ヘルプ、提案、質問はすべて大歓迎です。

ありがとう。

4

2 に答える 2

2

あなたはそれをに変更することができます

SELECT  f.[pkFileID]
        ,x.[fkDocumentHeaderID]
        ,f.[fkDocumentID]
        ,x.[Version]
        ,x.[Revision]
        ,f.[FileURL]
        ,f.[UploadedBy]
        ,f.[UploadedDate]
FROM    (
          SELECT  docs.[fkDocumentHeaderID]
                  ,MAX([Version] * 100000 + [Revision]) AS [VersionRevision] 
          FROM    [ClinicalGuidanceV2].[dbo].[tbl_DocumentFiles]
                  INNER JOIN dbo.tbl_Documents docs 
                    ON [fkDocumentID] = [pkDocumentID]
          GROUP BY
                  docs.[fkDocumentHeaderID]
        )AS x
        INNER JOIN dbo.tbl_DocumentFiles f 
          ON f.[fkDocumentHeaderID] = x.[fkDocumentHeaderID] 
             AND f.[Version] * 100000 + f.[Revision] = x.[VersionRevision] 

アイデアは、バージョンに十分な大きさの定数を掛けて、リビジョンと衝突しないようにすることです(私は100.000を取りましたが、どの値でもかまいません)。

その後、JOINはレコードを取得するために同じことを行います。

于 2010-11-16T14:37:24.203 に答える
0

以下は、トップリビジョンを抽出するために機能するはずです。

SELECT TOP 1 f.[pkFileID]
   ,x.[fkDocumentHeaderID]
   ,f.[fkDocumentID]
   ,x.[Version]
   ,x.[Revision]
   ,f.[FileURL]
   ,f.[UploadedBy]
   ,f.[UploadedDate]
FROM 
(
     SELECT 
     docs.[fkDocumentHeaderID]
     ,MAX([Version]) AS Version
     -- Comment this out ,MAX([Revision]) AS Revision
 FROM 
     [ClinicalGuidanceV2].[dbo].[tbl_DocumentFiles]
 INNER JOIN 
     dbo.tbl_Documents docs ON [fkDocumentID] = [pkDocumentID]
 GROUP BY
     docs.[fkDocumentHeaderID]
)
AS x
INNER JOIN
 dbo.tbl_DocumentFiles f ON 
 f.[fkDocumentHeaderID] = x.[fkDocumentHeaderID] AND 
 f.[Version] = x.[Version] 
ORDER BY x.Revision DESC

つまり、最大バージョンを使用するレコードのみをテーブルxに抽出します。次に、これらのレコードをリビジョン順に降順で並べ替え、束の最上位を抽出します。

于 2010-11-16T14:38:56.303 に答える