lightdb -- 兼容Oracle -- 支持 connect by rownum

介绍

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)



请使用浏览器的分享功能分享到微信等