Как можно случайным образом распределить строки в одной таблице по строкам в другой таблице в Oracle SQL - PullRequest
0 голосов
/ 25 февраля 2019

Я пытаюсь определить запрос SQL, который будет случайным образом распределять записи из одной таблицы в другую.

например: у меня есть таблица клиентов, и я хочу назначить каждому автомобиль изтаблица автомобилей.

Я хочу убедиться, что машина распределена случайным образом, но у Клиента нет собственности, которая могла бы предсказать, какую машину они получат.

Клиенты: (Джон, Сэм, Сара, Джек, Адам, Адриан)

Автомобили: (BMW, Dodge, Lexus)

Результат:

(Джон-БМВ, Сэм-Лексус, Сара-БМВ, Джек-Додж, Адам-Додж, Адриан-БМВ)

Как я могу это сделать в Oracle SQL?

Ответы [ 3 ]

0 голосов
/ 25 февраля 2019

Один метод, который может быть более эффективным, чем полное перекрестное соединение:

select c.*, cc.car
from (select c.*,
             row_number() over (order by dbms_random.value(1, cc.cnt) as seqnum
      from customers c cross join
           (select count(*) as cnt from cars) cc
     ) c join
     (select cc.*, row_number() over (order by dbms_random.random) as seqnum
      from cars cc
     ) cc
     on cc.seqnum = c.seqnum;
0 голосов
/ 25 февраля 2019

если нет ограничений на использование всех машин и ресурсов БД:

select customer_name||'-'||car_name result 
from (
    select u.name customer_name, c.name car_name, 
        row_number() over ( partition by u.name order by dbms_random.value ) ord
    from customers u
    cross join cars c
)
where ord = 1
0 голосов
/ 25 февраля 2019

Вот один из вариантов:

SQL> with t as
  2    (select u.name ||'-'||a.name comb,
  3       row_number() over (partition by u.name order by dbms_random.value(1, n.cnt)) rn
  4     from customers u cross join cars a
  5     join (select count(*) cnt from cars) n on 1 = 1
  6    )
  7  select t.comb
  8  from t
  9  where rn = 1;

COMB
-----------------------------------------
Adam-Lexus
Adrian-BMW
Jack-Lexus
Jon-BMW
Sam-Dodge
Sara-Lexus

6 rows selected.

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