如何列出仅显示每个文档的最新版本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)
由于
答案 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];