如何在系统周期时态表中与/ subselect联接

时间:2018-08-20 21:08:54

标签: sql db2 temporal-database

我有一个db2数据库和一个系统周期的时态表,因此很容易通过以下方式获取在特定日期有效的数据

SELECT mtt_sometimes_updated_value FROM my_temp_table FOR SYSTEM_TIME AS OF TIMESTAMP('2018-01-31') WHERE mtt_key = '...'

这将给我一行(当我按键过滤时),但是如果在where条件中没有键,我也可以添加FETCH FIRST 1 ROW ONLY

现在,我想将其用作子选择或与another_table结合使用,它在mtt_key列中具有at_key的值,并具有at_additional_key和{{1 }}。我想要的是与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 -我可以在https://www.ibm.com/support/knowledgecenter/en/SSEPEK_11.0.0/codes/src/tpc/n20524.html上找到错误描述-但我不是很理解-似乎无法使用另一个表的列{ {1}}。

那么,我可以通过某种方式与这些临时表联接,或者如何从这两个表中获取所需信息?有任何想法吗?有什么提示吗?谢谢。

我看到的唯一方法是手动尝试处理由系统周期时态表生成的时间戳的复杂方法,但是我希望在某处有更简单的方法...或者只是对语法的误解我的子选择

这里有一些示例数据来阐明我所拥有的和我想要的:

INVALID PERIOD SPECIFICATION OR PERIOD CLAUSE FOR PERIOD SYSTEM_TIME. REASON CODE = 03. SQLCODE=-20524中有一个当前行,该行已于2018年1月7日更新

mt_key | mtt_so_up_val | (was updated on)
-------+---------------+-----------------
1      | Z             | (2018-01-07)

以前的更新是

1      | Y             | (2018-01-02)
1      | X             | (2017-12-24)

FOR SYSTEM_TIME AS OF看起来像这样

at_key | at_additional_key | at_date_column
-------+-------------------+---------------
1      | A                 | 2018-01-01
1      | B                 | 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      | I                 | 2018-01-09

对于不同的键,可能会有更多的数据,但是如果我为键= 1进行过滤,则结果应该是

at_key | at_additional_key | at_date_column | mtt_so_up_val
-------+-------------------+----------------+--------------
1      | A                 | 2018-01-01     | X
1      | B                 | 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      | I                 | 2018-01-09     | Z

因此,我想使用该特定日期的有效值来增强表格。希望这很清楚...

1 个答案:

答案 0 :(得分:1)

您目前不支持使用列,在这种语法中,您必须明确指定日期或时间戳。 为了解除此限制,我已经开放了RFE (Request for Enhancement) - ID 111742 位候选人,但如果您支持我的要求,请投反对票。

您仍然可以以传统方式解决此问题(无需使用新语法)。 我强烈推荐此blog article "Fun with Date Ranges"以获得详细信息