Procedurální prvky jako smyčky nejsou součástí jazyka SQL a lze je použít pouze v těle funkce procedurálního jazyka, procedury (Postgres 11 nebo novější) nebo DO
prohlášení, kde jsou tyto dodatečné prvky definovány příslušným procedurálním jazykem. Výchozí je PL/pgSQL, ale existují i jiné.
Příklad s 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$;
Pro mnoho úloh, které lze vyřešit pomocí smyčky, existuje kratší a rychlejší set-based řešení za rohem. Čistý ekvivalent SQL pro váš příklad:
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;
O generate_series()
:
- Jaké je očekávané chování pro více funkcí vracejících sadu v klauzuli SELECT?
O optimalizaci výkonu náhodných výběrů:
- Nejlepší způsob, jak vybrat náhodné řádky PostgreSQL