Procedimiento elementos como bucles no forman parte del lenguaje SQL y solo se pueden usar dentro del cuerpo de una función de lenguaje procedimental, un procedimiento (Postgres 11 o posterior) o un DO
declaración, donde tales elementos adicionales están definidos por el lenguaje procesal respectivo. El valor predeterminado es PL/pgSQL, pero hay otros.
Ejemplo con 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$;
Para muchas tareas que se pueden resolver con un bucle, existe un basado en conjuntos más corto y más rápido. solución a la vuelta de la esquina. Equivalente de SQL puro para su ejemplo:
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;
Acerca de generate_series()
:
- ¿Cuál es el comportamiento esperado para varias funciones de devolución de conjuntos en la cláusula SELECT?
Acerca de la optimización del rendimiento de las selecciones aleatorias:
- La mejor manera de seleccionar filas aleatorias PostgreSQL