【发布时间】:2017-10-18 04:50:50
【问题描述】:
我根据我们的业务需求使用 ETL 应用程序填充了我的目标表。 这个目标表有 5 个“级别”,对于每个级别,我必须插入它们相应的“子”数据。这是我选择要插入的“子”数据的脚本(请注意,还有其他列,但下面的脚本只是为了展示我如何遍历表以识别 5 个级别:
select
code_test_data + 200 as CODE_test_data_child,
test_data from targetTable
where level_test_data in (select level from dual t connect by level <=5)
order by level_test_data
目的是在我的 etl 应用程序插入主数据后执行 sql 脚本来插入子数据。
我的问题是:
如何为“子”插入管理目标表的 id 列?主插入的 id 列由我的 etl 应用程序管理。 我正在考虑几种方法:
1) 创建一个返回 max(id)+1 的函数。所以对于每一个插入,我都可以调用这个函数来添加id
2) 序列:使用Oracle 的序列功能添加最大id。但是我必须对序列的起始值进行“硬”编码。起始值将来自目标表的 max(id)。我真的不想硬编码起始值
3) 我尝试在插入 (col1,col2..) 中使用 max(id)+1 选择 max(id)+1.. 但这只是将每行的 id 增加 1。
谁有更好的解决方案可以分享一下吗?
谢谢大家
编辑:
插入主数据后,我会插入子数据,但子插入的id必须是max(id)+1: 示例:row1=1, primaryTest1, level1...row2= 2, primaryTest2, Level2...newinserts=3, childTest1 | 4, childTest1 | 5, childTest2 | 6, childTest2 ...希望这个例子能澄清我的问题。
【问题讨论】:
-
哪个 Oracle 版本?
-
我不确定你在问什么。我最好的解释是 - 您想将数据(1 个主插入,5 个子插入)插入到单个表中。主节点的 PK 由 ETL 应用程序预先确定。您希望将 PK 值分配给子插入而不冲突的序列值。是对的吗?如果是,我建议您使用使用两列的复合 PK - 级别(0 表示主插入,否则为 1-5),然后是一个键(使用 ETL 值作为主插入,使用序列作为子插入)。那么'key'列中是否存在冲突并不重要
-
您好 Christian,插入主数据后,我将插入子数据,但子数据插入的 id 必须为 max(id)+1:示例:row1=1,primaryTest1,level1。 .. row2= 2, primaryTest2, Level2 ...newinserts=3, childTest1 | 4、childTest1 | 5、childTest2 | 6、childTest2 ...我希望这个例子能澄清我的问题。谢谢