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()
- 这两种技术都会为您提供DocumentsVersions
table 的插入记录的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的主要内容,如果未能解决你的问题,请参考以下文章