У меня есть две таблицы, custassets
и tags
. Чтобы сгенерировать некоторые тестовые данные, я хотел бы сделать таблицу INSERT INTO
со многими для многих с SELECT
, которая получает случайные строки от каждого (чтобы случайный первичный ключ из одной таблицы был сопряжен со случайным первичным ключом из второго) , К моему удивлению, это не так просто, как я впервые подумал, поэтому я упорствую в этом, чтобы научить себя.Как я могу получить случайный декартова продукт в PostgreSQL?
Это моя первая попытка. Я выбираю 10 custassets
и 3 tags
, но оба они одинаковы в каждом случае. Я был бы в порядке с первой фиксированной таблицей, но я хотел бы рандомизировать назначенные теги.
SELECT
custassets_rand.id custassets_id,
tags_rand.id tags_rand_id
FROM
(
SELECT id FROM custassets WHERE defunct = false ORDER BY RANDOM() LIMIT 10
) AS custassets_rand
,
(
SELECT id FROM tags WHERE defunct = false ORDER BY RANDOM() LIMIT 3
) AS tags_rand
Это дает:
custassets_id | tags_rand_id
---------------+--------------
9849 | 3322 }
9849 | 4871 } this pattern of tag PKs is repeated
9849 | 5188 }
12145 | 3322
12145 | 4871
12145 | 5188
17837 | 3322
17837 | 4871
17837 | 5188
....
Затем я попробовал следующий подход: делать второй RANDOM()
вызов в списке SELECT
колонка. Однако это было хуже, поскольку он выбирает один тег PK и придерживается его.
SELECT
custassets_rand.id custassets_id,
(SELECT id FROM tags WHERE defunct = false ORDER BY RANDOM() LIMIT 1) tags_rand_id
FROM
(
SELECT id FROM custassets WHERE defunct = false ORDER BY RANDOM() LIMIT 30
) AS custassets_rand
Результат:
custassets_id | tags_rand_id
---------------+--------------
16694 | 1537
14204 | 1537
23823 | 1537
34799 | 1537
36388 | 1537
....
Это было бы легко на языке сценариев, и я уверен, что можно сделать довольно легко с хранимой процедурой или временной таблицы. Но могу ли я сделать это только с INSERT INTO SELECT
?
Я думал о выборе целых первичных ключей с использованием случайной функции, но, к сожалению, первичные ключи для обеих таблиц имеют пробелы в последовательностях инкремента (и поэтому в каждой таблице может быть выбрана пустая строка). В противном случае это было бы хорошо!
Спасибо всем, кто прокомментировал - если бы это зависело от меня, я бы присвоил несколько тиков! ':-)' – halfer