插入父母和孩子的记录

问题描述 投票:0回答:1

我有2个表,它们的父表为emp_info,子表为emp_attendance,它们通过empid连接。

当前,我使用2种不同的序列,每个表均使用一个序列来创建Empid。对于emp_attendance表,我创建的记录具有空值,而不是使用随机日期时间字段插入或更新的值。下面的Ses代码。

我想摆脱emp_attendance_seq和MERGE代码序列,或者嵌套插入,或者使用emp_info表中的empid来填充emp_attendance表。

您能为我的要求提供解决方法吗?

拖放顺序emp_info_seq;删除表emp_info;掉落顺序emp_attendance_seq;删除表emp_attendance;

Create sequence  emp_info_seq;


CREATE TABLE emp_info(
   empid INTEGER,
 empname VARCHAR2(50)
);



INSERT INTO  emp_info 
SELECT emp_info_seq.NEXTVAL,
DBMS_RANDOM.string('U', 
  DBMS_RANDOM.value(3,15))
FROM    dual
CONNECT BY  LEVEL  <=3;



Create sequence
emp_attendance_seq;




CREATE TABLE  emp_attendance    
(empid INTEGER,
 start_date DATE,
 end_date DATE );



INSERT INTO  emp_attendance
(empid)
SELECT
emp_attendance_seq.NEXTVAL
FROM    dual
CONNECT BY  LEVEL  <= 3   ;

MERGE INTO  emp_attendance  dst
USING  (
           WITH    cntr (n)  AS
           (
               SELECT  LEVEL  AS n
               FROM    dual
               CONNECT BY  LEVEL <=5

       )
       ,    got_start_date (rid, empid, start_date)   AS
       (
           SELECT  CASE
                       WHEN  cntr.n  = 1
                       THEN  e.ROWID
                   END
    ,       e.empid
           ,       trunc(sysdate)
                       + dbms_random.value (1, 30)
           FROM    emp_attendance  e
           CROSS JOIN              cntr
           WHERE   e.start_date  IS NULL
       )
       SELECT  rid
       ,       empid
       ,       start_date
       ,       start_date + dbms_random.value (0, .75)  AS end_date
       FROM    got_start_date
   )  src
ON  (dst.ROWID  = src.rid)
WHEN MATCHED THEN UPDATE
    SET  dst.start_date = src.start_date
    ,    dst.end_date   = src.end_date
WHEN NOT MATCHED THEN.   
INSERT (dst.empid, dst.start_date, dst.end_date)
       VALUES (src.empid,  src.start_date, src.end_date)
;

/

EMPID    START_DATE     END_DATE
1    20200603 20:06:47    20200603 21:51:02
1    20200611 08:07:12    20200611 20:34:13
1    20200614 10:24:01    20200614 17:16:12
2    20200616 04:50:04    20200616 19:08:22
2    20200608 19:39:52    20200608 21:01:01
2    20200613 00:56:53    20200613 08:23:10
3    20200615 13:46:58    20200616 01:30:50
3    20200621 03:15:32    20200621 07:54:38
3    20200613 04:13:58    20200613 06:38:28
sql oracle parent-child
1个回答
0
投票

我已经在某个地方回答过类似的问题,但是找不到。我的建议是使用insert all。下面的示例在第一个表中生成3行,并在子表中为每个表生成5行:

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 ceil(level/5) id,
       case mod(level, 5) 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 dual connect by level <= 3 * 5

[dbfiddle] >>

© www.soinside.com 2019 - 2024. All rights reserved.