PostgreSQL
 sql >> Base de Dados >  >> RDS >> PostgreSQL

Postgres PARA LOOP


Procedimento elementos como loops não fazem parte da linguagem SQL e só podem ser usados ​​dentro do corpo de uma função de linguagem procedural, procedimento (Postgres 11 ou posterior) ou um DO declaração, onde tais elementos adicionais são definidos pela respectiva linguagem processual. O padrão é PL/pgSQL, mas existem outros.

Exemplo com 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 muitas tarefas que podem ser resolvidas com um loop, há um baseado em conjunto mais curto e mais rápido solução ao virar da esquina. Equivalente de SQL puro para o seu exemplo:
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;

Sobre generate_series() :
  • Qual ​​é o comportamento esperado para várias funções de retorno de conjunto na cláusula SELECT?

Sobre a otimização do desempenho de seleções aleatórias:
  • Melhor maneira de selecionar linhas aleatórias PostgreSQL