我有一个 db2 数据库和一个系统周期时态表,因此很容易通过以下方式获取在特定日期有效的数据
SELECT mtt_sometimes_updated_value FROM my_temp_table FOR SYSTEM_TIME AS OF TIMESTAMP('2018-01-31') WHERE mtt_key = '...'
这将给我一行(因为我按键过滤(,但我也可以添加FETCH FIRST 1 ROW ONLY
以防我在 where 条件中没有键。
现在我想将其用作子选择或与another_table
联接,该在第at_key
列中具有mtt_key
的值,以及一个at_additional_key
和一个at_date_column
。我想要的是与my_temp_table
相结合,让每一行都another_table
通过mtt_sometimes_updated_value
增强。
当我尝试看似直观的东西时
SELECT at_key, at_additional_key, at_date_column,
(SELECT mtt_sometimes_updated_value
FROM my_temp_table FOR SYSTEM_TIME AS OF at_date_column
WHERE mtt_key = at_key)
FROM another_table
我INVALID PERIOD SPECIFICATION OR PERIOD CLAUSE FOR PERIOD SYSTEM_TIME. REASON CODE = 03. SQLCODE=-20524
收到错误 - 我可以在 https://www.ibm.com/support/knowledgecenter/en/SSEPEK_11.0.0/codes/src/tpc/n20524.html 上找到错误描述 - 但我真的不明白 - 似乎无法使用另一个表的列FOR SYSTEM_TIME AS OF
.
那么,我是否可以以某种方式加入这些临时表,或者如何从这两个表中获取所需信息?有什么想法吗?有什么提示吗?谢谢。
我看到的唯一方法是手动尝试处理系统周期时态表生成的时间戳的复杂方法,但我希望某处有更简单的方法......或者只是对我的子选择中的语法的误解
以下是一些示例数据,用于阐明我拥有什么以及我想要什么:
表my_temporal_table
有一个当前行,该行已于 2018-01-07 更新
mt_key | mtt_so_up_val |(已更新( -------+---------------+----------------- 1 |Z |(2018-01-07(
以前的更新已打开
1 |Y |(2018-01-02) 1 |X |(2017-12-24(
表another_table
如下所示
at_key | at_additional_key | at_date_column -------+-------------------+--------------- 1 |一 |2018-01-01 1 |乙 |2018-01-02 1 |C |2018-01-03 1 |D |2018-01-04 1 |E |2018-01-05 1 |F |2018-01-06 1 |G |2018-01-07 1 |H |2018-01-08 1 |一 |2018-01-09
不同的键可能有更多的数据,但如果我过滤键 = 1,那么结果应该是
at_key | at_additional_key | at_date_column | mtt_so_up_val -------+-------------------+----------------+-------------- 1 |一 |2018-01-01 |X 1 |乙 |2018-01-02 |Y 1 |C |2018-01-03 |Y 1 |D |2018-01-04 |Y 1 |E |2018-01-05 |Y 1 |F |2018-01-06 |Y 1 |G |2018-01-07 |Z 1 |H |2018-01-08 |Z 1 |一 |2018-01-09 |Z
所以我想用该特定日期有效的值来增强表格。希望这足够清楚...
目前不支持使用列 - 在此 sytax 中,您必须明确指定日期或时间戳。 为了解除此限制,我打开了一个 RFE(增强请求(- ID 111742 它已经是一个未承诺的候选人,但如果你支持我的请求,请投票支持它。
您仍然可以用传统方式解决它(没有新语法(。 我强烈推荐这篇博客文章"日期范围的乐趣"以了解详细信息