生成随机数目的子记录

mmvthczy  于 2021-07-26  发布在  Java
关注(0)|答案(1)|浏览(397)

我成功地使用下面的代码生成了20个父记录,每个记录有15个子记录。如何修改此代码以为每个父级生成随机数(即5-20)随机子记录。
创建表emp_info(empid integer,empname varchar2(50));

  1. CREATE TABLE emp_attendance
  2. (empid INTEGER,
  3. start_date DATE,
  4. end_date DATE
  5. );

--带cte的选件

  1. insert all
  2. when rn = 1 then into emp_info (empid, empname) values (id, name)
  3. when 1 = 1 then into emp_attendance (empid, start_date, end_date)
  4. values (id, d1, d1 + dbms_random.value (0, .75))
  5. with t as (select nvl(max(empid), 0) maxid from emp_info)
  6. select ceil(maxid + level/15) id,
  7. case mod(maxid + level, 15) when 1 then 1 end rn,
  8. dbms_random.string('U', dbms_random.value(3, 15)) name,
  9. trunc(sysdate) + dbms_random.value (1, 30) d1
  10. from t connect by level <= 20 * 15;
  11. -- 20 parent records 15 children each
4ktjp1zp

4ktjp1zp1#

你可以利用 ROW_NUMBER 功能如下:
--有关说明,请参见内联注解

  1. insert all
  2. when rn = 1 then into emp_info (empid, empname) values (id, name)
  3. when 1 = 1 then into emp_attendance (empid, start_date, end_date)
  4. values (id, d1, d1 + dbms_random.value (0, .75))
  5. select * from
  6. (
  7. with t as (select nvl(max(empid), 0) maxid from emp_info)
  8. select ceil(maxid + level/15) id,
  9. case mod(maxid + level, 15) when 1 then 1 end rn,
  10. dbms_random.string('U', dbms_random.value(3, 15)) name,
  11. trunc(sysdate) + dbms_random.value (1, 30) d1,
  12. case when row_number() over (partition by ceil(maxid + level/15)
  13. order by level) > 5 then
  14. dbms_random.value(5, 20)
  15. else 5 end as random_val -- added this expression as column
  16. from t connect by level <= 20 * 20 -- changed it from 15 to 20
  17. )
  18. where random_val <= 12; -- this is random number less than 20
展开查看全部

相关问题