Procédure des éléments comme des boucles ne font pas partie du langage SQL et ne peuvent être utilisés que dans le corps d'une fonction de langage procédural, d'une procédure (Postgres 11 ou version ultérieure) ou d'un DO
déclaration, où ces éléments supplémentaires sont définis par le langage procédural respectif. La valeur par défaut est PL/pgSQL, mais il y en a d'autres.
Exemple avec 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$;
Pour de nombreuses tâches qui peuvent être résolues avec une boucle, il existe une méthode basée sur un ensemble plus courte et plus rapide solution au coin de la rue. Équivalent SQL pur pour votre exemple :
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;
À propos de generate_series()
:
- Quel est le comportement attendu pour plusieurs fonctions renvoyant des ensembles dans la clause SELECT ?
À propos de l'optimisation des performances des sélections aléatoires :
- Meilleur moyen de sélectionner des lignes aléatoires PostgreSQL