Procedureel elementen zoals loops maken geen deel uit van de SQL-taal en kunnen alleen worden gebruikt binnen de hoofdtekst van een proceduretaalfunctie, procedure (Postgres 11 of hoger) of een DO
verklaring, waarbij dergelijke aanvullende elementen worden gedefinieerd door de respectieve proceduretaal. De standaard is PL/pgSQL, maar er zijn andere.
Voorbeeld met 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$;
Voor veel taken die met een lus kunnen worden opgelost, is er een kortere en snellere set-based oplossing om de hoek. Pure SQL-equivalent voor uw voorbeeld:
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;
Over generate_series()
:
- Wat is het verwachte gedrag voor functies die meerdere sets retourneren in de SELECT-component?
Over het optimaliseren van de prestaties van willekeurige selecties:
- Beste manier om willekeurige rijen PostgreSQL te selecteren