1

我有三个表,它们的相关列是:

tPerson
-> PersonID

tPersonStatusHistory
-> PersonStatusHistoryID
-> PersonID
-> StatusID
-> PersonStatusDate

Status
-> StatusID

我想存储一个人曾经拥有的所有状态的完整历史记录。但我也希望轻松访问当前状态。

查询以获取当前状态:

SELECT TOP 1 StatusID FROM tPersonStatusHistory 
WHERE PersonID = ? ORDER BY PersonStatusDate DESC

我想要的是一个查询,它将获取我的个人记录列表,他们最近的 StatusID 作为查询中的一列。

我们尝试了以下方法:

  1. 将上述查询作为子查询包含在 select 中。
  2. 将 CurrentPersonStatusHistoryID 列添加到 tPerson 表并使用调用用户定义函数的计算列对其进行维护。
  3. 使用 tPersonStatusHistory 表上的触发器维护 CurrentPersonStatusHistoryID 列。

拉取 Person 记录的查询使用率很高,所以我不想每次都查找 History 表。触发方法最接近我想要的,因为数据保存在 Person 表中,并且仅在进行更新时才更改(相比之下,这并不经常发生)。

我发现触发器难以维护,我宁愿远离它们。我还发现,在执行插入选择或涉及多条记录的更新查询时,触发器仅在第一条记录上调用,而不在其他记录上调用。

我真正想要的是在 CurrentPersonStatusHistoryID 的列定义中添加一些逻辑,按下 Save 并让它在幕后保持和更新,而无需我的干预。

鉴于多对多关系很常见,我想知道是否有其他人遇到过类似的情况,并对实现这一点的最高性能、最好是最少麻烦的方式有所了解。

4

1 回答 1

1

另一种方法是使用类似于以下查询的内容,可能作为视图。它将为您提供每个人的最新状态 ID。

SELECT PersonID, StatusID
FROM (
    SELECT PersonID, StatusID,
        rank() OVER(PARTITION BY PersonID ORDER BY PersonStatusDate DESC) as rnk
    FROM tPersonStatusHistory
) A
WHERE rnk = 1

我不确定这是否满足您对性能的要求,但您可以研究一下。

于 2012-05-03T00:50:43.047 回答