介绍
connect by rownum 用于生成序列,首先获取表中的所有记录,然后为获取的第一条记录生成 N 个孩子节点。
connect by rownum 用于生成序列,完全可以通过 PG 的 `generate_series` 函数代替
`SELECT ... FROM DUAL CONNECT BY rownum <=10`
等价于
`SELECT ... FROM generate_series (...)`
使用案例
lightdb支持了 CONNECT BY rownum 语法,支持场景如下:
-- 生成序列 select rownum from dual CONNECT BY rownum <= 6; rownum -------- 1 2 3 4 5 6 (6 rows) -- rownum表达式 select rownum from duals CONNECT BY rownum + 2 - 1 <= 2 + 2; rownum -------- 1 2 3 (3 rows) SELECT empno, ename, mgr, LEVEL FROM emp_ CONNECT BY rownum + empno < 3; ERROR: connect by rownum does not support rownum Op column LINE 7: emp_ CONNECT BY rownum + empno < 3; ^ select rownum from duals CONNECT BY 6 > rownum * 2; ERROR: connect by rownum does not support Multiplication or division operation LINE 4: duals CONNECT BY 6 > rownum * 2; ^ -- 生成序列,对序列增加Non-SPJ操作 select rownum from dual CONNECT BY rownum <= 6 ORDER BY 1 DESC LIMIT 2; rownum -------- 6 5 (2 rows) -- 绑定变量 PREPARE my_query (VARCHAR) AS select rownum from duals CONNECT BY rownum <= $1; EXECUTE my_query(6); rownum -------- 1 2 3 4 5 6 (6 rows) -- 不支持多表 SELECT empno, ename, mgr, LEVEL FROM emp_, emp_2 where emp_.empno = emp_2.mgr CONNECT BY rownum <= 6; ERROR: connect by rownum not support multi tables SELECT empno, ename, mgr, LEVEL FROM emp_ join emp_2 on emp_.empno = emp_2.mgr CONNECT BY rownum <= 6; ERROR: connect by rownum not support multi tables -- 函数 CREATE OR REPLACE FUNCTION generate_rownums(limit_value BIGINT) RETURNS SETOF BIGINT AS $$ BEGIN RETURN QUERY select rownum from duals CONNECT BY rownum <= limit_value; END; $$ LANGUAGE plpgsql; select generate_rownums(6); generate_rownums ------------------ 1 2 3 4 5 6 (6 rows)