我有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
我已经在某个地方回答过类似的问题,但是找不到。我的建议是使用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] >>