Как выполнить функцию базы данных в предложении FROM несколько раз - PullRequest
0 голосов
/ 03 мая 2020

Я работаю над проектом базы данных postgreSQL, и мне нужно генерировать большие данные довольно быстро. Итак, у меня есть таблица с именем pacient_info , где pacient_id и соответствующий doctor_id.

Теперь мне нужно сгенерировать прибл. 1 мил. строки в таблице называются экзамены , где первые два столбца должны быть pacient_id и doctor_id , а затем некоторая дата, но это не важно.

Поскольку я не могу выбрать случайный pacient_id и случайный doctor_id (эти два должны быть правильными согласно таблице pacient_info ) Я создал эту функцию

CREATE OR REPLACE FUNCTION pacient_doctor()
    RETURNS TABLE (pac INT, doc INT)
AS $$
BEGIN
    RETURN QUERY SELECT
        pacient_id,
        doctor_id
        FROM pacient_info tablesample system_rows(10) order by random() LIMIT 1;
END; $$
LANGUAGE 'plpgsql';

, который возвращает один случайный кортеж из таблицы pacient_info . Наконец, когда я хотел вставить в таблицу экзаменов , я сделал это:

insert into examinations (doctor_id, pacient_id, set_date)
select
    pd.pac,
    pd.doc,
    (SELECT set_date from dates where i != -1 order by random() LIMIT 1)
from
(SELECT * from pacient_doctor()) pd,
 generate_series(1, 1000000) as seq(i);

, но это дало мне один и тот же кортеж во многих строках, поскольку между этими таблицами существует неявное CROSS JOIN , У меня нет 1 мил. строк в pacient_info , но там 4500 строк, поэтому должно быть только (1 000 000/4 500) 222 дублированных кортежа, но их гораздо больше (500, если быть точным).

Может кто-нибудь помочь мне, как заставить функцию как-то выполняться каждый раз для новой строки?

Большое спасибо!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...