如何根据其他表格中的字段动态设置字段

时间:2019-05-30 22:04:09

标签: sql oracle

我的数据库中有两个表。

  

当前表具有记录(键,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_tslast_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

我想要做的是通过将keyHistory 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 |
+------+---------------------------------+------------+

1 个答案:

答案 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