Verfahrensweise Elemente wie Schleifen sind nicht Teil der SQL-Sprache und können nur innerhalb des Körpers einer prozeduralen Sprachfunktion, einer Prozedur (Postgres 11 oder höher) oder eines DO
verwendet werden Erklärung, wenn solche zusätzlichen Elemente durch die jeweilige Verfahrenssprache definiert sind. Der Standard ist PL/pgSQL, aber es gibt noch andere.
Beispiel mit plpgsql:
DO
$do$
BEGIN
FOR i IN 1..25 LOOP
INSERT INTO playtime.meta_random_sample
(col_i, col_id) -- declare target columns!
SELECT i, id
FROM tbl
ORDER BY random()
LIMIT 15000;
END LOOP;
END
$do$;
Für viele Aufgaben, die mit einer Schleife gelöst werden können, gibt es eine kürzere und schnellere Set-basierte Lösung um die Ecke. Reines SQL-Äquivalent für Ihr Beispiel:
INSERT INTO playtime.meta_random_sample (col_i, col_id)
SELECT t.*
FROM generate_series(1,25) i
CROSS JOIN LATERAL (
SELECT i, id
FROM tbl
ORDER BY random()
LIMIT 15000
) t;
Über generate_series()
:
- Was ist das erwartete Verhalten für mehrere Set-zurückgebende Funktionen in der SELECT-Klausel?
Über die Optimierung der Leistung von Zufallsauswahlen:
- Bester Weg, zufällige Zeilen PostgreSQL auszuwählen