Procedur element som slingor är inte en del av SQL-språket och kan endast användas i kroppen av en procedurspråkfunktion, procedur (Postgres 11 eller senare) eller en DO
uttalande, där sådana ytterligare element definieras av respektive procedurspråk. Standard är PL/pgSQL, men det finns andra.
Exempel med 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 många uppgifter som kan lösas med en loop finns en kortare och snabbare uppsättningsbaserad lösning runt hörnet. Ren SQL-motsvarighet för ditt exempel:
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;
Om generate_series()
:
- Vad är det förväntade beteendet för flera set-returfunktioner i SELECT-satsen?
Om optimering av prestanda för slumpmässiga val:
- Bästa sättet att välja slumpmässiga rader PostgreSQL