这与我之前提出的另一个问题有关。如果您快速扫描它,您可能会对此有更好的理解。 Version Numbers float, decimal or double
我在数据库表中有两个列和一个外来词。 [版本] 列和 [修订版] 列。这些与版本号有关。 e.g。版本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.1
,1.2
和2.0
,我从上面的查询返回的最大值是2.2
(没有'存在)。
我需要做的(我认为)是选择最大[版本],然后为[版本]选择最大[修订],但我无法确定如何执行此操作。
欢迎任何帮助,建议和问题。
感谢。
答案 0 :(得分: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会做同样的事情来检索记录。
答案 1 :(得分: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
即,它仅使用max version将记录提取到表x中。然后它按降序对这些记录进行排序,并提取最顶层的记录。