sql >> Base de Datos >  >> RDS >> PostgreSQL

PostgreSQL PARA BUCLE

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