【问题标题】:SQL Query - Get Most Recent Document Version URL for Each DocumentSQL 查询 - 获取每个文档的最新文档版本 URL
【发布时间】:2026-02-06 08:05:02
【问题描述】:

我怎样才能列出所有文档,仅显示每个文档的最新版本 URL?

注意: 文档可以有多个版本的文档版本。版本由版本号 1、2、3 等标记...

我有以下 sql 但不确定是否是最有效的方法。

select * 
from documents d
inner join documentVersions v on d.id = v.documentid
                              and v.id = (select top (1) v2.id 
                                          from documentversions v2 
                                          where v2.documentid = v.documentid 
                                          order by v2.version desc)

谢谢

【问题讨论】:

  • 为什么不能使用DocumentVersions 表中的CreatedDate 列而不是TOP(1),因为总是最后创建最新版本?
  • 或子查询中的max(Version)

标签: sql sql-server greatest-n-per-group


【解决方案1】:

最好不要在Documents 表(或其中)中使用ModifiedDate,而让VersionID 列与DocumentsVersions 表的ID 匹配。

这可以在插入新版本文档的例程中轻松完成。在为不同文档插入多条记录时使用OUTPUT 子句或使用SCOPE_IDENTITY() - 这两种技术都会为您提供DocumentsVersionstable 的插入记录的ID - 然后,只需更新Documents表。

我们正在使用这样的VersionID 列,其中我们有不断更新的文档。拥有这样的列将简化您的查询并提高性能,因为您将执行INNER JOIN

SELECT *
FROM Documents A
INNER JOIN DocumentsVersions B
    ON A.[VersionID] = B.[ID];

【讨论】:

    【解决方案2】:

    更新: 根据您的问题:这足以满足您的要求。

        select t2.documentid,t1.name,max(t2.version) 
        from 
        documents t1 JOIN documentversions t2 
        on t1.id=t2.documentid group by t1.name,t2.documentid 
        order by t2.version,t2.createddate desc.
    

    【讨论】:

      【解决方案3】:

      尝试:

      select * into #DocumentVersions from  (
      select 1 DocumentId, 2 Version, '12 ' Url  union all
      select 1 DocumentId, 1 Version, '31 ' Url  union all
      select 1 DocumentId, 3 Version, '33 ' Url  union all
      select 2 DocumentId, 9 Version, '11 ' Url  union all
      select 2 DocumentId, 1 Version, '12 ' Url  union all
      select 3 DocumentId, 1 Version, '31 ' Url  
      ) x
      select * into #documents from  (
                 select 1 id  union all
                  select 2 id  union all
                   select 3 id 
      ) y
      Select  *
      from    #documents documents
          left join  (
              select  *,
                  ROW_NUMBER() over(partition by documentid order by version desc) as top_row
              from    #documentVersions
          ) as documentVersions on  documents.id = documentid 
          where top_row = 1
      

      【讨论】:

        【解决方案4】:

        尝试使用打击查询,这将返回每个文档的最新版本。

        Select  *
        from    documents d
            inner join  (
                select  *,
                    ROW_NUMBER() over(partition by v.documentid order by v.version desc) as row_no
                from    documentVersions v
            ) as v2 on  d.id = v2.documentid and v2.row_no = 1
        

        还有很多其他方法可以做到这一点。 例如;- 如果您在创建每个DocumentVersions 时将Document.ModifiedDate 更新为与DocumentVersions.CratedDate 相同,那么您可以简单地查询这个

        Select * 
        from documents d
        inner join documentVersions v
         on d.id = v.documentid
         and d.ModifiedDate = v.CratedDate
        

        【讨论】:

        • 或者您也可以将最新版本号存储在文档表中。