SQL 查询 - 获取每个文档的最新文档版本 URL

Posted

技术标签:

【中文标题】SQL 查询 - 获取每个文档的最新文档版本 URL【英文标题】:SQL Query - Get Most Recent Document Version URL for Each Document 【发布时间】:2018-04-06 01:17:46 【问题描述】:

我怎样才能列出所有文档,仅显示每个文档的最新版本 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) 【参考方案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

【讨论】:

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

以上是关于SQL 查询 - 获取每个文档的最新文档版本 URL的主要内容,如果未能解决你的问题,请参考以下文章

Cosmos DB - 查询所选分区的最新文档?

从 SP 2010 文档库中获取文档的最新签入版本(文档)

如何从 MySQL 列中的 JSON 文档中获取最新值?

子查询返回每个父 ID 的最新条目

sql查询获取每个id的最新记录

使用聚合查询获取具有总交易计数和交易详细信息的用户列表作为嵌入文档