Sql H2数据库递归查询结果不正确

Sql H2数据库递归查询结果不正确,sql,h2,hierarchical-data,recursive-query,Sql,H2,Hierarchical Data,Recursive Query,我正在尝试H2数据库。它比Derby数据库有很多特性,其中一个就是递归。但是,当我尝试普遍使用的scott/tiger的EMP表时,结果并不像预期的那样。请看一看: with e1(empno, ename, mgr, job, hiredate, l) as ( select empno, ename, mgr, job, hiredate, 0 from emp where mgr is null union all select e2.empno, e2.ename, e2

我正在尝试H2数据库。它比Derby数据库有很多特性,其中一个就是递归。但是,当我尝试普遍使用的scott/tiger的EMP表时,结果并不像预期的那样。请看一看:

with e1(empno, ename, mgr, job, hiredate, l) as ( 
select empno, ename, mgr, job, hiredate, 0 
from   emp 
where  mgr is null 
union all 
select e2.empno, e2.ename, e2.mgr, e2.job, e2.hiredate, l+1 
from   emp e2, e1 
where  e2.mgr = e1.empno) 
select * from e1;
结果是:

EMPNO  ENAME  MGR  JOB  HIREDATE  L  
7839 KING null PRESIDENT 1981-11-17 0 
7566 JONES 7839 MANAGER 1981-04-02 1 
7698 BLAKE 7839 MANAGER 1981-05-01 1 
7782 CLARK 7839 MANAGER 1981-06-09 1 
7499 ALLEN 7698 SALESMAN 1981-02-20 2 
7521 WARD 7698 SALESMAN 1981-02-22 2 
7654 MARTIN 7698 SALESMAN 1981-09-28 2 
7788 SCOTT 7566 ANALYST 1987-07-13 2 
7844 TURNER 7698 SALESMAN 1981-09-08 2 
7900 JAMES 7698 CLERK 1981-12-03 2 
7902 FORD 7566 ANALYST 1981-12-03 2 
7934 MILLER 7782 CLERK 1982-01-23 2 
7369 SMITH 7902 CLERK 1980-12-17 3 
7876 ADAMS 7788 CLERK 1987-07-13 3 
(14 rows, 0 ms)
所有的经理都在一起,然后是办事员等。 我希望结果有所不同

对于相同的查询,我在Postgres中执行了以下操作:

with recursive emp_tree(empno, ename, deptno, job, sal, mgr, l, tree) as (
select empno,
       ename,
       deptno,
       job,
       sal,
       mgr,
       0 as l,
       Array[empno] || '{}'
from emp
where  mgr is null
union all
select e2.empno,
       e2.ename,
       e2.deptno,
       e2.job,
       e2.sal,
       e2.mgr,
       emp_tree.l + 1,
       Array_append(tree, e2.empno)
from emp e2,
       emp_tree
where  e2.mgr = emp_tree.empno)
select * from emp_tree
order by tree
结果非常完美:

"empno";"ename";"deptno";"job";"sal";"mgr";"l";"tree"
7839;"KING";10;"PRESIDENT";5000.00;;0;"{7839}"
7566;"JONES";20;"MANAGER";2975.00;7839;1;"{7839,7566}"
7788;"SCOTT";20;"ANALYST";3000.00;7566;2;"{7839,7566,7788}"
7876;"ADAMS";20;"CLERK";1100.00;7788;3;"{7839,7566,7788,7876}"
7902;"FORD";20;"ANALYST";3000.00;7566;2;"{7839,7566,7902}"
7369;"SMITH";20;"CLERK";800.00;7902;3;"{7839,7566,7902,7369}"
7698;"BLAKE";30;"MANAGER";2850.00;7839;1;"{7839,7698}"
7499;"ALLEN";30;"SALESMAN";1600.00;7698;2;"{7839,7698,7499}"
7521;"WARD";30;"SALESMAN";1250.00;7698;2;"{7839,7698,7521}"
7654;"MARTIN";30;"SALESMAN";1250.00;7698;2;"{7839,7698,7654}"
7844;"TURNER";30;"SALESMAN";1500.00;7698;2;"{7839,7698,7844}"
7900;"JAMES";30;"CLERK";950.00;7698;2;"{7839,7698,7900}"
7782;"CLARK";10;"MANAGER";2450.00;7839;1;"{7839,7782}"
7934;"MILLER";10;"CLERK";1300.00;7782;2;"{7839,7782,7934}"
请注意,在分层查询中,我无法在empno或加入日期排序结果,因为史密斯(办事员)在金(总裁)之前加入。所以,史密斯的empno在国王的empno之前

请建议我在H2中做同样的工作

谢谢和问候


BB23850

您在H2中得到的结果是“正确的”-您没有指定任何排序顺序,因此数据库可以自由选择它想要的任何顺序

您可以使用字符串连接来模拟H2中Postgres中使用的数组:

with e1 (empno, ename, mgr, job, hiredate, path, lvl) as 
( 
  select empno, ename, mgr, job, hiredate, '/'||lpad(empno, 6, '0'), 0
  from emp 
  where mgr is null 
  union all 
  select child.empno, child.ename, child.mgr, child.job, child.hiredate, 
         parent.path||'/'||lpad(child.empno, 6, '0'), 
         parent.lvl + 1
  from emp child
    join e1 parent on child.mgr = parent.empno
) 
select *
from e1
order by path;
lpad()是必需的,因为最后的order by是在字符串上完成的,并且
'10'
将在
'2'
之前排序。用零填充数字可以解决字符串比较的问题