Order Siblings by 排序

在层次查询中,如果想让“亲兄弟”按规矩进行升序排序就需要使用ORDER SIBLINGS BY 这个特定的排序语句,若要降序输出可以在其后添加DESC关键字。
通过这个实验给大家展示一下这个“亲兄弟”间的排序功能。

1.回望关系“树”,这棵树中的B和C是亲兄弟,F和G是亲兄弟。注意,D和E不是亲兄弟,最多也就算是堂兄弟,“亲兄弟排序”功能对他们无效。

      A
     / \
    B   C
   /   /
  D   E
 / \
F   G

2.上图对应的表数据

test=# select * from t1;                  
 x  | y | z 
----+---+---
 A  | 1 |  
 B  | 2 | 1
 C  | 3 | 1
 D  | 4 | 2
 E  | 5 | 3
 F  | 6 | 4
 G  | 7 | 4

3.我们对X列使用“ORDER SIBLINGS BY”进行升序排序,重点关注B和C、F和G的顺序。

test=# select lpad(' ',level-1)||x tree, SYS_CONNECT_BY_PATH(x,'/') tree_path from t1 start with x = 'A' connect by prior y=z order siblings by x;
 tree  |  tree_path   
-------+--------------
 A     | /A 
  B    | /A /B 
   D   | /A /B /D 
    F  | /A /B /D /F 
    G  | /A /B /D /G 
  C    | /A /C 
   E   | /A /C /E 
(7 行记录)

4.我们对X列使用“ORDER SIBLINGS BY DESC”进行降序排序,重点关注B和C、F和G的顺序。

test=# select lpad(' ',level-1)||x tree, SYS_CONNECT_BY_PATH(x,'/') tree_path from t1 start with x = 'A' connect by prior y=z order siblings by x desc;
 tree  |  tree_path   
-------+--------------
 A     | /A 
  C    | /A /C 
   E   | /A /C /E 
  B    | /A /B 
   D   | /A /B /D 
    G  | /A /B /D /G 
    F  | /A /B /D /F 
(7 行记录)

5.如在层次查询中错误的使用了“ORDER BY”进行排序,则层次查询中蕴含的遍历顺序将被打乱,剩下的将只是信息的罗列。

test=# select lpad(' ',level-1)||x tree, SYS_CONNECT_BY_PATH(x,'/') tree_path from t1 start with x = 'A' connect by prior y=z order by x;
 tree  |  tree_path   
-------+--------------
 A     | /A 
  B    | /A /B 
  C    | /A /C 
   D   | /A /B /D 
   E   | /A /C /E 
    F  | /A /B /D /F 
    G  | /A /B /D /G 
(7 行记录)

6.小结
具体问题具体分析,特殊场合特出方法。在层次查询中如需对亲兄弟的先后顺序进行限定,就必须要使用特有的“ORDER SIBLINGS BY”而非“ORDER BY”子句。

posted @ 2022-05-13 13:56  KINGBASE研究院  阅读(117)  评论(0编辑  收藏  举报