2010-11-16 58 views
3

这与我之前询问的另一个问题有关。如果快速扫描它,您可能会对此有更深入的了解。 Version Numbers float, decimal or double从两列中选择最大版本号

我在数据库表中有两个colums和一个外国人。 A [版本]列和[修订]列。这些与版本号有关。 例如版本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] 

基本上抓住了最大并加入到它自身。这obvisouly不起作用,因为如果我有版本号1.11.22.0我从上面的查询返回的最大值是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执行相同的检索记录。

+0

完美的作品,谢谢。 – Jamie 2010-11-16 15:02:13

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中的记录。然后按降序排列这些记录,并提取最上面的那些记录。

+0

此查询只返回1个结果,而不是所有外键的最高结果。不是我一直在寻找,但感谢您的帮助。 – Jamie 2010-11-16 15:03:41