Процедурни елементи като цикли не са част от SQL езика и могат да се използват само в тялото на функция на процедурен език, процедура (Postgres 11 или по-нова версия) или DO
изявление, когато такива допълнителни елементи са дефинирани от съответния процедурен език. По подразбиране е PL/pgSQL, но има и други.
Пример с 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$;
За много задачи, които могат да бъдат решени с цикъл, има по-кратък и по-бързбазиран на набор решение зад ъгъла. Чист SQL еквивалент за вашия пример:
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;
Относно generate_series()
:
- Какво е очакваното поведение за множество функции, връщащи набор в клауза SELECT?
Относно оптимизирането на производителността на произволни селекции:
- Най-добрият начин за избор на произволни редове PostgreSQL