Ich habe zwei Tabellen, custassets
und tags
. Um einige Testdaten zu erzeugen, möchte ich eine INSERT INTO
eine Viele-zu-Viele-Tabelle mit einer SELECT
machen, die zufällige Reihen von jedem bekommt (so dass ein zufälliger Primärschlüssel von einer Tabelle mit einem zufälligen Primärschlüssel von der Sekunde gepaart wird) . Zu meiner Überraschung ist das nicht so einfach wie ich zuerst dachte, also beharre ich damit, um mich selbst zu unterrichten.Wie bekomme ich ein zufälliges kartesisches Produkt in PostgreSQL?
Hier ist mein erster Versuch. Ich wähle 10 custassets
und 3 tags
, aber beide sind in jedem Fall gleich. Es würde mir gut gehen, wenn der erste Tisch repariert wird, aber ich möchte die zugewiesenen Tags zufällig randomisieren.
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
Dies erzeugt:
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
....
Ich habe dann versucht, den folgenden Ansatz: den zweiten RANDOM()
Aufruf in der SELECT
Spaltenliste zu tun. Allerdings war dieses eine schlimmer, da es ein einzelnes Tag PK auswählt und dabei bleibt.
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
Ergebnis:
custassets_id | tags_rand_id
---------------+--------------
16694 | 1537
14204 | 1537
23823 | 1537
34799 | 1537
36388 | 1537
....
Dies würde in einer Skriptsprache einfach sein, und ich bin sicher, dass mit einer Stored Procedure oder temporärer Tabelle ganz einfach durchgeführt werden. Aber kann ich es nur mit einer INSERT INTO SELECT
tun?
Ich dachte über die Auswahl von Integer-Primärschlüssel mit einer zufälligen Funktion, aber leider haben die Primärschlüssel für beide Tabellen Lücken in den Inkrement-Sequenzen (und so eine leere Zeile in jeder Tabelle gewählt werden kann). Das wäre sonst gut gewesen!
Danke an alle, die kommentiert haben - wenn es nach mir ginge, hätte ich mehrere Zecken vergeben! ':-)' – halfer