function factorial(i) { if (i > 1) { return i * factorial(i-1); } else { return 1; } } console.log(factorial(10));
WITH RECURSIVE r AS ( -- (.. "anchor") SELECT 1 AS i, 1 AS factorial UNION -- SELECT i+1 AS i, factorial * (i+1) as factorial FROM r WHERE i < 10 ) SELECT * FROM r; i | factorial ----+----------- 1 | 1 2 | 2 3 | 6 4 | 24 5 | 120 6 | 720 7 | 5040 8 | 40320 9 | 362880 10 | 3628800 (10 rows)
SELECT 10000! -- ,
CREATE TABLE geo ( id int not null primary key, parent_id int references geo(id), name varchar(1000) ); INSERT INTO geo (id, parent_id, name) VALUES (1, null, ' '), (2, 1, ' '), (3, 1, ' '), (4, 2, ''), (5, 4, ''), (6, 4, ''), (7, 5, ''), (8, 5, '-'), (9, 6, '');
WITH RECURSIVE r AS ( SELECT id, parent_id, name FROM geo WHERE parent_id = 4 UNION SELECT id, parent_id FROM geo WHERE parent_id IN ( SELECT id FROM r ) ) SELECT * FROM r; ERROR: recursive reference to query "r" must not appear within a subquery
WITH RECURSIVE r AS ( SELECT id, parent_id, name FROM geo WHERE parent_id = 4 UNION SELECT geo.id, geo.parent_id, geo.name FROM geo JOIN r ON geo.parent_id = r.id ) SELECT * FROM r; id | parent_id | name ----+-----------+----------------- 5 | 4 | 6 | 4 | 7 | 5 | 8 | 5 | - 9 | 6 | (5 rows)
WITH RECURSIVE r AS ( SELECT id, parent_id, name, 1 AS level FROM geo WHERE id = 4 UNION ALL SELECT geo.id, geo.parent_id, geo.name, r.level + 1 AS level FROM geo JOIN r ON geo.parent_id = r.id ) SELECT * FROM r; id | parent_id | name | level ----+-----------+-----------------+------- 4 | 2 | | 1 5 | 4 | | 2 6 | 4 | | 2 7 | 5 | | 3 8 | 5 | - | 3 9 | 6 | | 3 (6 rows)
Source: https://habr.com/ru/post/269497/
All Articles