Как получить случайное декартово произведение в PostgreSQL?

У меня есть две таблицы, custassetsи теги. Чтобы сгенерировать некоторые тестовые данные, я хотел бы выполнить INSERT INTOтаблицу «многие ко многим» с SELECT. ], который получает случайные строки из каждой (так что случайный первичный ключ из одной таблицы сочетается со случайным первичным ключом из второй). К моему удивлению, это не так просто, как я сначала думал, поэтому я настаиваю на этом

Вот моя первая попытка. Я выбираю 10 custassetsи 3 тега, но оба одинаковы в каждом случае. Мне подойдет первая таблица исправлено, но я хотел бы рандомизировать назначенные теги.

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. Однако этот был хуже, так как le tag 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?

Я думал о выборе целочисленных первичных ключей с помощью случайной функции, но, к сожалению, первичные ключи для обеих таблиц имеют пробелы в последовательностях приращения (поэтому в каждой таблице может быть выбрана пустая строка).Иначе было бы хорошо!

11
задан halfer 15 May 2012 в 18:48
поделиться