Thủ tục các phần tử như vòng lặp không phải là một phần của ngôn ngữ SQL và chỉ có thể được sử dụng bên trong phần thân của một hàm, thủ tục ngôn ngữ thủ tục (Postgres 11 trở lên) hoặc một DO
tuyên bố, trong đó các phần tử bổ sung như vậy được xác định bằng ngôn ngữ thủ tục tương ứng. Mặc định là PL / pgSQL, nhưng có những cái khác.
Ví dụ với 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$;
Đối với nhiều tác vụ có thể được giải quyết bằng vòng lặp, có một dựa trên bộ ngắn hơn và nhanh hơn giải pháp xung quanh góc. Tương đương SQL thuần túy cho ví dụ của bạn:
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;
Giới thiệu về generate_series()
:
- Hành vi mong đợi cho nhiều hàm trả về trong mệnh đề SELECT là gì?
Giới thiệu về tối ưu hóa hiệu suất của các lựa chọn ngẫu nhiên:
- Cách tốt nhất để chọn các hàng ngẫu nhiên PostgreSQL