ORDER SIBLINGS BY 子句

ORDER SIBLINGS BY 子句仅在层级查询中是有效的。 可选的 SIBLINGS 关键字指定首先对父行排序,以及然后对该层级之内每个级别的每一父行的孩子行进行排序的顺序。

有些行有 SIBLINGS BY 关键字之后指定的列中的值的重复列表,这些行在带有相同的值列表和相同的父行的那些行之中是任意排序的。如果层级查询包括不带有 SIBLINGS 关键字的 ORDER BY 子句,则根据那些跟在 ORDER BY 关键字之后的排序规范来排列行的顺序。在层级查询中,既不需要 ORDER BY 子句,也不需要 ORDER BY 子句的 ORDER SIBLINGS BY 选项。

在下列示例中的层级查询返回层级数据集中的行的子集,其根为 Goyal,如主题 层级查询子句 中罗列的那样。 此查询包括 ORDER SIBLINGS BY 子句来按照 name 对那些报告给同一管理者的员工进行排序:

SELECT empid, name, mgrid, LEVEL
        FROM employee
        START WITH name = 'Goyal'
        CONNECT BY PRIOR empid = mgrid
        ORDER SIBLINGS BY name;

以下列顺序对此查询返回的行进行排序:

         empid name             mgrid       level 
            
            16 Goyal               17           1
            12 Henry               16           2
            7 O'Neil              12           3
            9 Shoeman             12           3
            8 Smith               12           3
            14 Scott               16           2
            11 Zander              16           2
            6 Barnes              11           3
            5 McKeough            11           3
            
            9 row(s) retrieved.
在此,START WITH 子句返回了在此层级的根部的 Goyal 行。 两个后续的 CONNECT BY 步骤(在 level 伪列中标记为 23)返回三个兄弟行的集合:
  • HenryScottZander 是其父母为 Goyal 的兄弟;
  • O'NeilShoemanSmith 是其父母为 Henry 的兄弟;
  • BarnesMcKeough 使其父母为 Zander 的兄弟。
下一 CONNECT BY 步骤未返回行,因为符合 level = 3 的那些行是此层级中的叶节点。在该查询的此执行点上,将 ORDER SIBLINGS BY 应用于结果集,按上述顺序对这些行排序。

由于该排序键 name 为 VARCHAR 列,因此在每一兄弟的集合之内的返回的行都按照它们的 employee.name 值的 ASCII 顺序排列。仅在返回的行的层级中为叶节点的那些兄弟的集合在排序的结果集中连续地出现,因为管理者紧跟在向他们报告的员工之后,而不是他们的兄弟。此示例中的例外是 Scott,其孩子节点形成空集。

ORDER BY 子句中的 SIBLINGS 关键字是对 SQL 语言的 ISO 标准语法的扩展。如果您在不包括有效的 CONNECT BY 子句的查询或子查询的 ORDER BY 子句中包括 SIBLINGS 关键字,则 SELECT 语句失败并报错。

要获取更多关于层级查询和 CONNECT BY 子句的信息,请参阅 层级查询子句