我正在尝试在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,但看起来没有达到令人满意的答案,所以我想我会再次发帖。
答案 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 ...你介意尝试吗?