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

时间:2017-10-25 04:42:36

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

如何列出仅显示每个文档的最新版本URL的所有文档?

注意:文档可以包含多个版本的文档。版本标记为版本号1,2,3等...

enter image description here

我有以下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)

由于

4 个答案:

答案 0 :(得分:0)

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

    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.

答案 1 :(得分:0)

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

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

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

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

答案 2 :(得分:0)

尝试:

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

答案 3 :(得分:0)

最好不要让ModifiedDate表格中的Documents(或其中包含VersionID的{​​{1}}列与ID匹配DocumentsVersions表格。

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

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

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