【问题标题】:SELECT random records from two tables从两个表中选择随机记录
【发布时间】:2020-06-19 09:35:44
【问题描述】:

我有 2 个源表员工、位置,它们没有相同的记录数和一个目标表 access_history。

我想随机选择记录(每个表中的一些列)并用这些值填充我的目标表。

我知道我可以执行子查询(见下文)来填充 access_history 表的员工部分。

INSERT into table access_history
SELECT 
from ( select employee_id, 
                     card_num 
                    from employees 
                    where 
                      last_name like '%' 
        order by dbms_random.value  ) 
      where rownum <= 2

我有 2 个问题,如何使用随机值填充 access_history 表的位置部分。

其次,如何使用随机但有意义的 DATETIME 值填充 access_date 列?有意义的是一个日期层次结构,其中第二个日期比第一个日期大 10 分钟 - 5 小时,第三个日期比第二个日期大相同的标准,依此类推,对于每个随机雇员 ID 的每条记录。

最后,这只是测试数据,我不担心性能问题,因为我知道 DBMS_RANDOM 存在开销。我的目标是将其包装在按级别

提前感谢所有回答的人。

我的数据应该是这样的:

SELECT * from access_history 
ORDER BY employee_id, access_date 

1, 'AAA1', 101,  '06212020 21:02:04', 0
1, 'AAA1', 102,  '06212020 21:22:54', 0
1, 'AAA1', 104,  06222020 01:13:11', 0
1, 'AAA1', 101,  '06212020 05:29:22', 0

3, 'CCC3', 105,  '06212020 08:42:34',0,
3 'CCC3', 102,  '06212020 16:09:55', 0
3 'CCC3', 104,  '06212020 22:29:53', 0


CREATE TABLE employees
(
   employee_id NUMBER(6),
   first_name VARCHAR2(20),
   last_name VARCHAR2(25) NOT NULL,
   card_num varchar2(10)  NOT NULL
);

ALTER TABLE employees
     ADD ( CONSTRAINT employee_id_pk
   PRIMARY KEY (employee_id));


Insert into employees values (1, 'Mike', 'Jones', 'AAA1');

Insert into employees values (2, 'Jane', 'Doe', 'BBB2');


Insert into employees values (3, 'Paul', 'Smith', 'CCC3');

Insert into employees values (4, 'John', 'Henry', 'DDD4');



 Create table locations(
   location_id NUMBER(4),
   location_name varchar2(30),
   location_type char(1));

 -- A=access T=Time & Attendance 

ALTER TABLE locations 
     ADD ( CONSTRAINT lication_id_pk
   PRIMARY KEY (location_id));



Insert into locations values (101, 'South Front Door 1', 'T');

  Insert into locations values (102, 'South Front Door 2', 'T');

  Insert into locations values (103, 'East Back Door 1', 'T');

   Insert into locations values (104, 'East Back Door 2', 'T');

   Insert into locations values (105,'Computer Room', 'A');

   Insert into locations values (106,'1st Floor North',  'A');


Create table access_history(
   employee_id NUMBER(6), 
   card_num varchar2(10),
   location_id number(4),
   access_date date,
   processed NUMBER(1) default 0
);

【问题讨论】:

    标签: sql oracle random


    【解决方案1】:

    可能干净的 SQL 解决方案是可能的,但我会用两个简单的循环来制作 PLSQL 块。它更干净,可以看到发生了什么,易于修改:

    dbfiddle

    declare
      v_loc number;
      v_dt date;
    begin
      -- take two random employees
      for emp in (select employee_id, card_num 
                  from (select employee_id, card_num 
                        from employees order by dbms_random.value ) 
                  where rownum <= 2) loop
    
        -- set starting date
        v_dt := timestamp '2020-06-21 08:00:00';
    
        -- for each employee generate 3 to 5 rows
        for i in 1..dbms_random.value(3, 5) loop
    
          -- get random location
          select location_id 
            into v_loc 
            from (select location_id from locations order by dbms_random.value) 
            where rownum = 1;
    
            -- increase last used date by random 10 to 300 minutes
            v_dt := v_dt + dbms_random.value(10, 300)/(24*60);
    
            insert into access_history (employee_id, card_num, location_id, access_date)
            values (emp.employee_id, emp.card_num, v_loc, v_dt);
    
        end loop;
      end loop;
    end;
    

    【讨论】:

    • 当然。我将开始日期硬编码为与您类似的日期,但对于每一行,它都会增加随机值。还有两名员工。您可以将这些日期和员工人数作为过程参数或使用 sysdate 或随机值。只需将此代码块更改为带有参数的过程并使用它们而不是2 和给定日期。
    猜你喜欢
    • 1970-01-01
    • 2011-09-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-08
    • 1970-01-01
    相关资源
    最近更新 更多