sql - 生成随机数量的子记录

标签 sql oracle parent-child

我成功地使用下面的代码生成了 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/

相关文章:

多个表上的 SQL 计数(*)

sql - 将 "column = null"转换为 "column is null"?

c++ - 跟踪打开的子对话框

c - 如何从子进程获取返回值给父进程?

SQL更新查询在where子句中使用聚合函数和group by?

MYSQL 从第二个表中选择查询

sql - 从 Oracle 中的一个非常大的记录集中选择一个记录子集耗尽内存

c - 在 C 中从管道写入和读取整数

sql - 从 Oracle 将表导入 PostGres 的最佳方式?

Oracle - 如何从 YEAR、WEEKNUM 和 WEEKDAY 获取日期?