0

可以说,我有两张表,一张用于对象记录,一张用于有关这些对象的活动记录。

每次插入或更新对象时,我都会在此活动表中插入一条新记录。

为了以简单的方式告诉它,假设我在活动表中有四个字段;objectId、类型、状态和日期。

当一个对象即将更新时,我计划获取该对象的最后一个状态并查找更改。如果更新值与之前的值有差异,我将使用新输入设置该值,否则我将其设置为空。因此,例如在更新过程中,用户只更改对象的状态值,但类型值保持不变,因此我将插入一个新行,其中类型为空值,状态为新值。

从活动中选择 *;

oid 类型状态日期
-----------------------------------------
1 0 1 2009.03.05 17:58:07
1 空 2 2009.03.06 07:00:00
1 1 空 2009.03.07 20:18:07
1 3 空 2009.03.08 07:00:00

所以我必须创建一个视图来告诉我对象的当前状态,例如,

SELECT * FROM ObjectStateView 其中 oid = 1;

oid 类型状态日期
-----------------------------------------
1 3 2 2009.03.08 07:00:00

我如何实现这个_?

4

4 回答 4

0

您是否考虑过使用MAX功能?

select oid, type, status, MAX(date) as max_date 
from ObjectStateView 
where oid = 1
于 2009-03-06T13:50:36.573 回答
0

不太确定为什么要在其中使用空值。您可以通过比较最新条目与前一个条目来跟踪输入之间的变化。那么对象的当前状态就是表中的最新条目。您可以通过创建要跟踪更改的对象部分的哈希并将其存储为额外列来确定对象是否已更改。

于 2009-03-06T13:51:38.583 回答
0

假设日期可用于查找最新记录:

CREATE VIEW foo
AS
    SELECT
        A.oid,
        (SELECT TOP 1 type FROM Activity At WHERE At.OID = A.oid AND At.Date <= MAX(A.date) AND type IS NOT NULL),
        (SELECT TOP 1 status FROM Activity Ast WHERE Ast.OID = A.oid AND Ast.Date <= MAX(A.date) AND status IS NOT NULL),
        MAX(A.date) AS date
    FROM
        Activity A
GO

编辑:如果你想要一个 JOIN (未经测试)

CREATE VIEW foo
AS
    SELECT TOP 1
        A.oid,
        At.type,
        Ast.status,
        A.date
    FROM
        Activity A
        LEFT JOIN
        (SELECT TOP 1 oid, date, type FROM Activity WHERE type IS NOT NULL ORDER BY date DESC) At ON A.OID = At.oid
        LEFT JOIN
        (SELECT TOP 1 oid, date, status FROM Activity WHERE status IS NOT NULL ORDER BY date DESC) Ast ON A.OID = Ast.oid
    ORDER BY date DESC
GO

应该早点添加这个:

它将呈指数级扩展,因为您必须触摸桌子 11 次不同的时间。

更好的解决方案是维护一个“当前”表并通过活动触发器来维护它。

于 2009-03-06T14:01:45.237 回答
0

历史价值:

由于您跟踪更改,您可能希望查看对象的历史状态:

SELECT      a.oid,
            a.date,
            a_type.type,
            a_status.status
FROM        Activity a
LEFT JOIN   Activity a_type
        ON  a_type.oid = a.oid
        AND a_type.date = (SELECT TOP 1 date FROM Activity WHERE oid = a.oid AND date <= a.date AND type IS NOT NULL ORDER BY date DESC)
LEFT JOIN   Activity a_status
        ON  a_status.oid = a.oid
        AND a_status.date = (SELECT TOP 1 date FROM Activity where oid = a.oid AND date <= a.date AND status IS NOT NULL ORDER BY date DESC)

这将返回:

oid         date       type        status
----------- ---------- ----------- -----------
1           2009-03-05 0           1
1           2009-03-06 0           2
1           2009-03-07 1           2
1           2009-03-08 3           2

性能考虑:

另一方面,如果您的字段多于几个字段,并且表很大,则性能将成为问题。在这种情况下,我还可以将整个值存储/缓存在另一个表MyDataHistory中,该表将包含如上表所示的数据。然后使用按 oid 和日期过滤最新行(仅 1 行)的 SQL 视图选择当前(最新)版本是微不足道的。

于 2009-05-28T16:43:04.943 回答