我成功地使用下面的代码生成了 20 条父记录,每条记录有 15 个子记录。我如何修改此代码来为每个父级生成随机数(即 5-20)个随机子记录。
创建表 emp_info ( empid 整数, empname VARCHAR2(50) );
CREATE TABLE emp_attendance
(empid INTEGER,
start_date DATE,
end_date DATE
);
-- 带 CTE 的选项
insert all
when rn = 1 then into emp_info (empid, empname) values (id, name)
when 1 = 1 then into emp_attendance (empid, start_date, end_date)
values (id, d1, d1 + dbms_random.value (0, .75))
with t as (select nvl(max(empid), 0) maxid from emp_info)
select ceil(maxid + level/15) id,
case mod(maxid + level, 15) when 1 then 1 end rn,
dbms_random.string('U', dbms_random.value(3, 15)) name,
trunc(sysdate) + dbms_random.value (1, 30) d1
from t connect by level <= 20 * 15;
-- 20 parent records 15 children each
最佳答案
您可以利用 ROW_NUMBER
函数,如下所示:
-- 请参阅内嵌注释以获取解释
insert all
when rn = 1 then into emp_info (empid, empname) values (id, name)
when 1 = 1 then into emp_attendance (empid, start_date, end_date)
values (id, d1, d1 + dbms_random.value (0, .75))
select * from
(
with t as (select nvl(max(empid), 0) maxid from emp_info)
select ceil(maxid + level/15) id,
case mod(maxid + level, 15) when 1 then 1 end rn,
dbms_random.string('U', dbms_random.value(3, 15)) name,
trunc(sysdate) + dbms_random.value (1, 30) d1,
case when row_number() over (partition by ceil(maxid + level/15)
order by level) > 5 then
dbms_random.value(5, 20)
else 5 end as random_val -- added this expression as column
from t connect by level <= 20 * 20 -- changed it from 15 to 20
)
where random_val <= 12; -- this is random number less than 20
关于sql - 生成随机数量的子记录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62192183/