Recursion 使用Xquery查询递归数据?

Recursion 使用Xquery查询递归数据?,recursion,xquery,Recursion,Xquery,我需要执行SQL中相当常见的分层查询。 但现在我需要使用Xquery对xml文档执行同样的操作 例如,我正在对标准Oracle教程中的递归连接功能进行建模。 这是表,但已转换为xml: <EMPLOYEES> <EMP> <EMPNO>7369</EMPNO> <ENAME>SMITH</ENAME> <JOB>CLERK</JOB> <MGR>7902

我需要执行SQL中相当常见的分层查询。 但现在我需要使用Xquery对xml文档执行同样的操作

例如,我正在对标准Oracle教程中的递归连接功能进行建模。 这是表,但已转换为xml:

<EMPLOYEES>
  <EMP>
    <EMPNO>7369</EMPNO>
    <ENAME>SMITH</ENAME>
    <JOB>CLERK</JOB>
    <MGR>7902</MGR>
    <HIREDATE>17-DEC-80</HIREDATE>
    <SAL>800</SAL>
  </EMP>
  <EMP>
    <EMPNO>7499</EMPNO>
    <ENAME>ALLEN</ENAME>
    <JOB>SALESMAN</JOB>
    <MGR>7698</MGR>
    <HIREDATE>20-FEB-81</HIREDATE>
    <SAL>1600</SAL>
    <COMM>300</COMM>
  </EMP>
  <EMP>
    <EMPNO>7521</EMPNO>
    <ENAME>WARD</ENAME>
    <JOB>SALESMAN</JOB>
    <MGR>7698</MGR>
    <HIREDATE>22-FEB-81</HIREDATE>
    <SAL>1250</SAL>
    <COMM>500</COMM>
  </EMP>
  <EMP>
    <EMPNO>7566</EMPNO>
    <ENAME>JONES</ENAME>
    <JOB>MANAGER</JOB>
    <MGR>7839</MGR>
    <HIREDATE>02-APR-81</HIREDATE>
    <SAL>2975</SAL>
  </EMP>
  <EMP>
    <EMPNO>7654</EMPNO>
    <ENAME>MARTIN</ENAME>
    <JOB>SALESMAN</JOB>
    <MGR>7698</MGR>
    <HIREDATE>28-SEP-81</HIREDATE>
    <SAL>1250</SAL>
    <COMM>1400</COMM>
  </EMP>
  <EMP>
    <EMPNO>7698</EMPNO>
    <ENAME>BLAKE</ENAME>
    <JOB>MANAGER</JOB>
    <MGR>7839</MGR>
    <HIREDATE>01-MAY-81</HIREDATE>
    <SAL>2850</SAL>
  </EMP>
  <EMP>
    <EMPNO>7782</EMPNO>
    <ENAME>CLARK</ENAME>
    <JOB>MANAGER</JOB>
    <MGR>7839</MGR>
    <HIREDATE>09-JUN-81</HIREDATE>
    <SAL>2450</SAL>
  </EMP>
  <EMP>
    <EMPNO>7788</EMPNO>
    <ENAME>SCOTT</ENAME>
    <JOB>ANALYST</JOB>
    <MGR>7566</MGR>
    <HIREDATE>19-APR-87</HIREDATE>
    <SAL>3000</SAL>
  </EMP>
  <EMP>
    <EMPNO>7839</EMPNO>
    <ENAME>KING</ENAME>
    <JOB>PRESIDENT</JOB>
    <HIREDATE>17-NOV-81</HIREDATE>
    <SAL>5000</SAL>
  </EMP>
  <EMP>
    <EMPNO>7844</EMPNO>
    <ENAME>TURNER</ENAME>
    <JOB>SALESMAN</JOB>
    <MGR>7698</MGR>
    <HIREDATE>08-SEP-81</HIREDATE>
    <SAL>1500</SAL>
    <COMM>0</COMM>
  </EMP>
  <EMP>
    <EMPNO>7876</EMPNO>
    <ENAME>ADAMS</ENAME>
    <JOB>CLERK</JOB>
    <MGR>7788</MGR>
    <HIREDATE>23-MAY-87</HIREDATE>
    <SAL>1100</SAL>
  </EMP>
  <EMP>
    <EMPNO>7900</EMPNO>
    <ENAME>JAMES</ENAME>
    <JOB>CLERK</JOB>
    <MGR>7698</MGR>
    <HIREDATE>03-DEC-81</HIREDATE>
    <SAL>950</SAL>
  </EMP>
  <EMP>
    <EMPNO>7902</EMPNO>
    <ENAME>FORD</ENAME>
    <JOB>ANALYST</JOB>
    <MGR>7566</MGR>
    <HIREDATE>03-DEC-81</HIREDATE>
    <SAL>3000</SAL>
  </EMP>
  <EMP>
    <EMPNO>7934</EMPNO>
    <ENAME>MILLER</ENAME>
    <JOB>CLERK</JOB>
    <MGR>7782</MGR>
    <HIREDATE>23-JAN-82</HIREDATE>
    <SAL>1300</SAL>
  </EMP>
</EMPLOYEES>

7369
史密斯
店员
7902
1980年12月17日
800
7499
艾伦
推销员
7698
1981年2月20日
1600
300
7521
病房
推销员
7698
1981年2月22日
1250
500
7566
琼斯
经理
7839
1981年4月2日
2975
7654
马丁
推销员
7698
1981年9月28日
1250
1400
7698
布莱克
经理
7839
1981年5月1日
2850
7782
克拉克
经理
7839
1981年6月9日
2450
7788
斯科特
分析师
7566
1987年4月19日
3000
7839
国王
主席:
1981年11月17日
5000
7844
特纳
推销员
7698
1981年9月8日
1500
0
7876
亚当斯
店员
7788
1987年5月23日
1100
7900
詹姆斯
店员
7698
1981年12月3日
950
7902
河流浅水处
分析师
7566
1981年12月3日
3000
7934
磨坊主
店员
7782
1982年1月23日
1300
我试图模拟SYS_CONNECT_BY_PATH函数,并为给定员工生成组织层次结构。e、 为员工亚当斯

琼斯·斯科特·亚当斯国王

链接在emp id和他的mgr代码之间

看起来递归字符串连接函数可以做到这一点,但我对Xquery太陌生,无法使用语法

我的观点有一部分源于“等级制”的概念。这不是我需要追求的文档层次结构。层次结构在数据中;呈现的更像一个链表


任何想法都将受到欢迎。

理想情况下,XML将按层次进行格式化,因此组织在XML中是隐式的,您所需要做的就是获取员工的祖先(或后代)。在这种情况下,您可以编写一个递归函数,该函数遵循从员工到经理员工的基于ID的链接路径:

declare function local:boss-R(
  $emp as element(EMP)?
) as xs:string*
{
  if (empty($emp)) then ()
  else 
    let $boss := $emp/ancestor::EMPLOYEES/EMP[EMPNO eq $emp/MGR]
    return ($boss/ENAME/string(), local:boss-R($boss))
};

declare function local:org(
  $emp as element(EMP)
) as xs:string+
{
  $emp/ENAME, local:boss-R($emp)
};

let $emp := doc('employees.xml')/EMPLOYEES/EMP[1]
return reverse(local:org($emp))