【发布时间】:2016-08-16 12:57:57
【问题描述】:
我搜索了很多,但找不到我的问题的答案。
所以,我必须在不同的表中生成大量数据(数百万行),并且这个脚本应该很快。
现在让我们谈谈 3 个特定的表,其中有 id 行:
- 在表Owners中,id从10000开始,递增1(有序列)
- 在表 Cars 中,id 从 10000000 开始,递增 1(有序列)。
在名为 Ownership 的第三个表中,我必须将这些 ID 与某些特定比率“合并”:
- 50% 的车主拥有一辆车
- 其余 20% 的车主拥有 2 辆车
- 其余 10-10-10% 将拥有 3、4 和 5 辆汽车
重要的事情:
- Owners 和 Cars 表的注意事项:费率:对于 100 个单元的所有者,将生成 210 个单元的汽车,并且在 Ownership 表中汽车将是独一无二的,因此该表中也将包含 210 行
- 首先是Owners,然后是Cars行
- 然后我在 Ownership 表中插入一些“来自”Cars 的值
注意:这是我在 Cars 中生成行的方式(Owners 类似)
(它将生成 v_custom_unit 件行,这个单位是根据我给出的费率计算得出的几行前(对于 100 个单元所有者,将生成 210 个单元汽车和 210 个单元所有权),然后我使用 for 循环来乘以行):
insert /*+ APPEND */ into Cars(
carId
, carType
, ...
)
select /*+ PARALLEL */
seq_carid.nextval as carId
, REGEXP_SUBSTR( 'Suziki,Toyota,Subaru,Saab,Hyundai,Opel,Volkswagen', '([^,]+)', 1, ROUND(DBMS_RANDOM.VALUE(1,7)) ) as carType
, ...
from dual
connect by level <= v_custom_unit;
乘法是这样的:
FOR i in 1..v_forSteps LOOP
EXECUTE IMMEDIATE '
insert /*+ APPEND */ into Cars (
carId,
, carType,
, ...
)
SELECT /*+ PARALLEL */
seq_carid.nextval as carId,
, carType
, ...
FROM Cars
WHERE ROWNUM <= ' || v_custom_unit;
COMMIT;
END LOOP;
下一步是生成所有权行:
insert /*+ APPEND */ into Ownership (
ownerId
, carId
, date_bought
)
select /*+ PARALLEL */
1
, c.carId
, some_random_date as date_bought
from Cars c;
我的问题来了:每辆车都在 OwnerId=1 的所有权中。
我的问题是:如何使用不同的所有者值更新 Ownership 表在一次更新中(并且可能保持利率 (50%-20%-10%-10%-10%))?
【问题讨论】: