我的数据库中有两个表。
当前表具有记录(键,last_updt_ts,数据)
历史记录表中有记录 (键,last_updt_ts,数据)当前表的主键为(key)
历史表有一个主要的 (key,last_updt_ts)的复合键注意,last_updt_ts代表上次更新时间戳记
现在History Table
记录Current Table
中发生的更改。在Current Table
中更改数据之前,记录已复制到History Table
中。
但是,由于发现了编码错误,因此last_updt_ts
中的History Table
已放入SYS_TIMESTAMP而不是last_updt_ts
中的Current Table
的值。 / p>
我认为不可能找出以前的值,但是我需要修正顺序。我们有一个查询,它将两个表合并到同一个表中(在Web浏览器上),并混合哪些数据是最新的,因为我们现在在History Table
中有值,其中{{1} }高于last_updt_ts
中的相同条目。当这种情况不应该发生时,Current Table
应该具有最新状态。
我在想Current Table
中的任何条目,其History Table
大于last_updt_ts
。应将Current Table
的输入设置为1毫秒。
据我所知,Current Table
中所有具有匹配密钥的条目的History Table
至少相隔500毫秒。而且对于每个密钥,只有一个条目的last_updt_ts
在last_updt_ts
中大于History Table
,
如何构造此查询?我不知所措。
Current Table
如您所见,因为其中一个条目在Sample data of current status:
Table A
+------+---------------------------------+----------+
| key | last_updt_ts | data |
+------+---------------------------------+----------+
| 1000 | 30-MAY-19 09.57.47.874000000 AM | new_data |
| 1001 | 30-MAY-19 09.50.47.874000000 AM | new_data |
+------+---------------------------------+----------+
Table B
+------+---------------------------------+------------+
| key | last_updt_ts | data |
+------+---------------------------------+------------+
| 1000 | 30-MAY-19 09.58.47.874000000 AM | old_data |
| 1001 | 30-MAY-19 09.51.47.874000000 AM | old_data |
| 1000 | 30-MAY-19 09.57.00.874000000 AM | older_data |
| 1001 | 30-MAY-19 09.49.00.874000000 AM | older_data |
+------+---------------------------------+------------+
Union of `Current Table` and `History Table`, that would appear on a web page
+------+---------------------------------+------------+
| key | last_updt_ts | data |
+------+---------------------------------+------------+
| 1000 | 30-MAY-19 09.58.47.874000000 AM | old_data |
| 1001 | 30-MAY-19 09.51.47.874000000 AM | old_data |
| 1000 | 30-MAY-19 09.57.47.874000000 AM | new_data |
| 1001 | 30-MAY-19 09.50.47.874000000 AM | new_data |
| 1000 | 30-MAY-19 09.57.00.874000000 AM | older_data |
| 1001 | 30-MAY-19 09.49.00.874000000 AM | older_data |
+------+---------------------------------+------------+
中具有更大的last_updt_ts
值。它使其对于该键的最新状态显示为old_data,但是History Table
仅用于记录保留,并且大多数情况下,History Table
的值永远不会比last_updt_ts
的高。相同的Current Table
。
我想要做的是通过将key
比History Table
的{{1}}高的任何条目设置为last_updt_ts
,使其晚于{ {1}}的
Current Table
这样,Web浏览器上的联合表将像这样,并且可以看到每个键的最高last_updt_ts
,显示Current Table
的最新状态
+------+---------------------------------+------------+
| key | last_updt_ts | data |
+------+---------------------------------+------------+
| 1000 | 30-MAY-19 09.57.47.774000000 AM | old_data |
| 1001 | 30-MAY-19 09.50.47.774000000 AM | old_data |
| 1000 | 30-MAY-19 09.57.00.874000000 AM | older_data |
| 1001 | 30-MAY-19 09.49.00.874000000 AM | older_data |
+------+---------------------------------+------------+
答案 0 :(得分:-2)
这是sqlserver的解决方案-您可能需要针对Oracle进行更新。
首先设置样本数据(使用表变量):
declare @A table(k int, ts datetime, d varchar(20))
insert @A values (1000,'30-MAY-2019 09:57:47:874','new_data')
,(1001,'30-MAY-2019 09:50:47:874 AM','new_data')
declare @B table(k int, ts datetime, d varchar(20))
insert @B values (1000,'30-MAY-2019 09:58:47:874 AM','old_data')
,(1001,'30-MAY-2019 09:51:47:874','old_data')
,(1000,'30-MAY-2019 09:57:00:874','older_data')
,(1001,'30-MAY-2019 09:49:00:874','older_data')
显示问题:
select * from @A union select * from @B order by 1,2 desc
k ts d
1000 2019-05-30 09:58:47.873 old_data
1000 2019-05-30 09:57:47.873 new_data
1000 2019-05-30 09:57:00.873 older_data
1001 2019-05-30 09:51:47.873 old_data
1001 2019-05-30 09:50:47.873 new_data
1001 2019-05-30 09:49:00.873 older_data
将所有历史记录更新为毫秒,直到
update B set ts=dateadd(ms,-1,a.ts) from @B B
join @A A on A.k=B.k and A.ts<b.ts
结果
select * from @A union select * from @B order by 1,2 desc
k ts d
1000 2019-05-30 09:57:47.873 new_data
1000 2019-05-30 09:57:47.873 old_data
1000 2019-05-30 09:57:00.873 older_data
1001 2019-05-30 09:50:47.873 new_data
1001 2019-05-30 09:50:47.873 old_data
1001 2019-05-30 09:49:00.873 older_data