通过使用 ORDER SIBLINGS BY 子句,可对结果集进行排序,以便按所选列值的升序或降序显示同级。这是 ORDER BY 子句的特例,只能用于分层查询。
上一查询进行了进一步修改,新增了 ORDER SIBLINGS BY ename ASC。
SELECT LEVEL, LPAD (' ', 2 * (LEVEL - 1)) || ename "employee", empno, mgr
FROM emp START WITH mgr IS NULL
CONNECT BY PRIOR empno = mgr
ORDER SIBLINGS BY ename ASC;
上一查询的输出现在也进行了修改,因此同级按名称的升序显示。同级 BLAKE、CLARK 和 JONES 现在按字母顺序排在 KING 下方。同级 ALLEN、JAMES、MARTIN、TURNER 和 WARD 按字母顺序排在 BLAKE 下方,依此类推。
level | employee | empno | mgr
-------+-------------+-------+------
1 | KING | 7839 |
2 | BLAKE | 7698 | 7839
3 | ALLEN | 7499 | 7698
3 | JAMES | 7900 | 7698
3 | MARTIN | 7654 | 7698
3 | TURNER | 7844 | 7698
3 | WARD | 7521 | 7698
2 | CLARK | 7782 | 7839
3 | MILLER | 7934 | 7782
2 | JONES | 7566 | 7839
3 | FORD | 7902 | 7566
4 | SMITH | 7369 | 7902
3 | SCOTT | 7788 | 7566
4 | ADAMS | 7876 | 7788
(14 rows)
以下最后一个示例新增了 WHERE 子句并以三个根节点开头。在构造节点树后,WHERE 子句会筛选树中的行以构成结果集。
SELECT LEVEL, LPAD (' ', 2 * (LEVEL - 1)) || ename "employee", empno, mgr
FROM emp WHERE mgr IN (7839, 7782, 7902, 7788)
START WITH ename IN ('BLAKE','CLARK','JONES')
CONNECT BY PRIOR empno = mgr
ORDER SIBLINGS BY ename ASC;
该查询的输出显示三个根节点(级别一):BLAKE、CLARK 和 JONES。此外,还从输出中消除了不符合 WHERE 子句的行。
level | employee | empno | mgr
-------+-----------+-------+------
1 | BLAKE | 7698 | 7839
1 | CLARK | 7782 | 7839
2 | MILLER | 7934 | 7782
1 | JONES | 7566 | 7839
3 | SMITH | 7369 | 7902
3 | ADAMS | 7876 | 7788
(6 rows)