基于时间戳的历史表中的SQL更新语句

时间:2012-05-30 15:25:09

标签: sql oracle10g

我正在尝试在Oracle中编写一个update语句,该语句将根据时间戳从历史记录表中查找属性。因此,例如数据如下:

TABLE A
A_ID  TIMESTAMP              ATTR
---------------------------------
1     5/27/2012 10:30:00 AM  ?

TABLE B
B_ID  A_ID  TIMESTAMP              ATTR
---------------------------------------
1     1     5/26/2012 9:01:08 AM   W
2     1     5/27/2012 8:38:21 AM   X
3     1     5/28/2012 9:01:01 AM   Y
4     1     5/29/2012 11:37:54 PM  Z  

下限是> = B.TIMESTAMP,但我不知道如何将上限写为< B.“下一个TIMESTAMP”。因此,在上面的示例中,表A上的属性应更新为“X”。

这似乎是一个相当常见的用例。我见过this post,但看起来没有达到令人满意的答案,所以我想我会再次发帖。

1 个答案:

答案 0 :(得分:0)

UPDATE A SET attr = (
    SELECT b1.attr 
    FROM B b1
        INNER JOIN (
            SELECT MAX(b3.timestamp) mx FROM B b3
            WHERE b3.timestamp < A.timestamp
        ) b2 ON b1.timestamp = b2.mx
)

我不记得Oracle是否允许我在内部联接子查询中使用表A ...你介意尝试吗?