3

这与我之前提出的另一个问题有关。如果您快速浏览它,您可能会对此有更好的理解。 版本号 float、decimal 或 double

我在数据库表中有两个列和一个外部。一个[Version]列和一个[Revision]列。这些与版本号有关。例如版本 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(不存在)。

我需要做的(我认为)是选择最大的 [Version],然后为该 [Version] 选择最大的 [Revision],但我不太清楚如何做到这一点。

欢迎任何帮助,建议,问题。

谢谢。

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 回答