【发布时间】:2014-08-21 20:31:45
【问题描述】:
我正试图考虑可以完成这项工作的查询,但我决定向您寻求帮助。
我有一个 Answer 表和一个 AnswerHistory 表。在我的 BLL 中,我有两个单独的方法来更新 Answer 表。当用户更改 Answer 表的 Title 或 Body 列时使用第一个。无论这两者中的哪一个被更新,都会在更改发生之前创建一个新的 AnswerHistory,其中包含 Answer 实体的所有字段。意思是,如果我将 Answer 实体的标题从“Title 1”更改为“Title 2”,我将有一个新的 AnswerHistory 实体,在 Title 列中有“Title 1”,以及此更改的日期发生。此外,另一个函数将 IsAccepted 列从 0 更改为 1,反之亦然。当然,它还创建了一个 AnswerHistory 实体。
总结一下: - 函数 1 更改标题和正文,创建一个新的 AnswerHistory 实体(Answer 实体的副本,在更改发生之前); - 函数 2 仅更改 IsAccepted 列。还会创建一个新的 Answer 实体(Answer 实体的副本,在更改发生之前)。
我想执行这样一个查询,该查询将检索由于运行函数 1 而创建的所有 AnswerHistory 实体。意思是,我想选择在某些用户更改标题或正文后出现的所有 AnswerHistories原始的 Answer 实体。我不想检索用户更改 Answer 的 IsAccepted 属性时创建的那些。
如果我在 Answer 表中有以下数据,
Id QeustionId Title Body IsAccepted CreationUserId CreationDate
1 1 Title1_3 Body1_3 1 2 2014-07-22
2 2 Title2_1 Body2_1 1 2 2014-07-22
3 3 Title3_2 Body3_2 0 2 2014-07-22
AnswerHistory 表中的这些实体
Id AnswerId Title Body IsAccepted ModificationDate
13 1 Title1_1 Body1_1 0 2014-08-06
14 1 Title1_1 Body1_1 1 2014-09-06
15 1 Title1_2 Body1_2 1 2014-10-06
16 2 Title2_1 Body2_1 0 2014-08-06
17 3 Title3_1 Body3_1 0 2014-08-06
我的查询应该返回:
Id AnswerId Title Body IsAccepted ModificationDate
14 1 Title1_1 Body1_1 1 2014-09-06
15 1 Title1_2 Body1_2 1 2014-10-06
17 3 Title3_1 Body3_1 0 2014-08-06
这可能吗?如果是,那怎么办?
顺便说一句,我不想改变我的架构并创建不同的历史表来处理不同的场景——当用户更改问题的标题或正文时,另一个对于 IsAccepted 更改。
编辑: 我正在使用 Microsoft SQL Server 2012。
【问题讨论】:
-
@paqogomez 我假设他的意思是微软的 SQL Server,这意味着 mssql
-
SQL Server 的哪个版本?
-
为什么 16 2 Title2_1 Body2_1 0 2014-08-06 不在结果中。
-
历史确实应该使用时间点列来处理。
-
16-2 不在结果中,因为它是由于更改 IsAccepted 列的值而产生的(查看答案表)。我决定采用这种方法,而不是时间点方法,因为我不(并且仍然不)想要数据可重复性(不确定这是否是正确的术语)。使用这种设计,我有我需要知道的一切,无需重复,使用更少的空间:)
标签: sql sql-server