【发布时间】:2013-03-10 19:48:03
【问题描述】:
问题是关于 SQL Server 2012 上的 SQL。
背景:
有一个实体叫Entity。
Entity 可以有 N EntityVersion (1:n)。
EntityVersion 可能会被批准或不被批准。如果是批准,则会在整个版本中分配一个属性ApprovedBy。
要求:
要求列出所有实体的最新实体版本,但只列出每个实体的最新批准版本。
问题:
我需要找到一种最佳方式来实现大规模解决方案的整个查询。
因此,我想到了两种可能的方法:
-
EntityVersion 上的 IsLast 标志列。每当添加新版本时,整个事务都会将
true设置为新添加的版本,而之前的最后一个版本将被分配false。 -
一个触发器,它将处理每个新的实体版本插入,并将新版本添加到一个只有最新版本的特殊表中。每当添加新版本时,都会从整个特殊表中删除以前的版本。也就是
SELECT获取整个listing会很便宜。
问题:
什么是最佳且有效的方法?您还有其他想法吗?
谢谢!
请注意,“最佳”意味着可扩展且可处理数百万条记录。
更新
由于我发现一些用户在他们的答案中询问Entity和EntityVersion的架构如何,我将更好地描述它们。
-
实体没有文本信息:只是一个标识符和与其他实体的关系。
-
EntityVersion 包含文本和其他信息。例如:标题、描述、作者... 需要指出的是,
EntityVersion没有来自Entity的任何重复信息。
最简单的解决方案是使用类似 SELECT DISTINCT 的东西,它既可以定义不同的列,也可以在同一查询中选择其他列。遗憾的是,据我所知,这在 SQL Server 中是不可能的(我错了吗?)。
【问题讨论】:
标签: .net sql sql-server tsql relational-database