ВЫБРАТЬ случайные записи из двух таблиц - PullRequest
0 голосов
/ 19 июня 2020

У меня есть 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 вопроса, как я могу заполнить часть location таблицы access_history со случайными значениями.

Во-вторых, как я могу заполнить столбец access_date случайными, но значимыми значениями DATETIME? Имеет значение иерархия дат, в которой вторая дата больше первой даты на 10 минут - 5 часов, третья дата больше второй даты по тем же критериям и так далее, и так для каждой записи на случайный идентификатор employee_id.

Наконец, это ТОЛЬКО тестовые данные, и меня не беспокоят проблемы с производительностью, поскольку я знаю, что с DBMS_RANDOM есть накладные расходы. Моя цель - заключить это в оператор connect by level <= 10000, чтобы я мог сгенерировать множество тестовых данных. </p>

Заранее спасибо всем, кто ответит.

Мои данные должны выглядеть примерно так это:

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
);

1 Ответ

1 голос
/ 19 июня 2020

Возможно чистое SQL решение, но я бы сделал блок PL SQL с двумя простыми циклами. Это намного чище, вы можете видеть, что происходит, легко изменить:

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;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...