Tengo dos tablas, custassets
y tags
. Para generar algunos datos de prueba me gustaría hacer una tabla de muchos a muchos INSERT INTO
con un SELECT
que obtiene filas aleatorias de cada uno (de modo que una clave primaria aleatoria de una tabla se empareja con una clave primaria aleatoria de la segunda) . Para mi sorpresa, esto no es tan fácil como pensé, así que persisto en esto para enseñarme a mí mismo.¿Cómo puedo obtener un producto cartesiano al azar en PostgreSQL?
Aquí está mi primer intento. Seleccioné 10 custassets
y 3 tags
, pero ambos son iguales en cada caso. Estaré bien con la primera tabla arreglada, pero me gustaría aleatorizar las etiquetas asignadas.
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
Esto produce:
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
....
Luego probé el siguiente enfoque: hacer el segundo RANDOM()
llamada de la lista SELECT
columna. Sin embargo, este fue peor, ya que elige una sola etiqueta PK y se queda con ella.
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
Resultado:
custassets_id | tags_rand_id
---------------+--------------
16694 | 1537
14204 | 1537
23823 | 1537
34799 | 1537
36388 | 1537
....
Esto sería fácil en un lenguaje de script, y estoy seguro de que se puede hacer muy fácilmente con un procedimiento almacenado o tabla temporal. ¿Pero puedo hacerlo solo con un INSERT INTO SELECT
?
Pensé en elegir claves primarias enteras usando una función aleatoria, pero desafortunadamente las claves primarias para ambas tablas tienen lagunas en las secuencias de incremento (por lo que se puede elegir una fila vacía en cada tabla). ¡Eso hubiera estado bien de otra manera!
Gracias a todos los que hicieron comentarios, si dependiera de mí, ¡habría otorgado varios tics! ':-)' – halfer