我有一个表,其中定义了父/子关系,但没有办法通过层次结构进行排序。
For example consider this:
empid managerid name
js hd George
hd ab Mary
hs js Tom
ab xx John
字符串
既然我不能使用ORDER SIBLINGS BY进行分层排序,那么我如何能够像下面这样以分层方式进行排序呢?
empid managerid name
ab xx John
hd ab Mary
js hd George
hs js Tom
型
3条答案
按热度按时间wbrvyc0a1#
这将是有帮助的,以显示我们的查询,你已经尝试到目前为止。这听起来像是有一个误解的地方。
对于非常小的样本数据,
Eng. Samer T
的答案是正确的。您不需要order by
子句。Oracle保证在connect by
查询中按层次顺序返回行。Oracle documentation on Hierarchical Queries:然而,让我们考虑一个有更多数据的例子,这样我们就有了兄弟姐妹。
字符串
如果我运行下面的
connect by
查询 * 而不带order by
子句:型
我得到(SqlFiddle):
型
注意层次结构是如何被尊重的,这是有保证的。然而,对于兄弟姐妹,顺序是不保证的。例如,不能保证
John
将 * 总是 * 在Other manager
之前列出,Tom
将在Waldo
之前列出,或者Lee
将在Stan
之前列出。如果您想保证兄弟中的顺序,但又不破坏层次结构的顺序,这正是
order siblings by
子句的作用。所以我不知道你为什么说:
我不能使用
ORDER SIBLINGS BY
进行分层排序因为,Oracle documentation on Hierarchical Queries几乎是相反的:
在分层查询中,不要指定
ORDER BY
或GROUP BY
,因为它们将覆盖CONNECT BY
结果的分层顺序。如果要对同一父代的兄弟行进行排序,请使用ORDER SIBLINGS BY
子句。请注意它是如何特别推荐使用
order siblings by
来对兄弟进行排序的,而不会破坏结果的层次顺序。假设我希望我的结果按层次结构排序,但兄弟节点按名称降序排序。然后我可以调整我之前的查询:
型
我的结果变成了(SqlFiddle):
型
请注意,层次结构仍然有效,但兄弟
John
和Other manager
被重新排序,因此Other manager
的整个结果树都列在John
之前。此外,Waldo
现在总是出现在Tom
之前,Stan
总是出现在Lee
之前。qybjjes12#
默认的“connect by”子句将返回结果。
从头开始,我假设“xx”意味着没有经理。
字符串
au9on6nz3#
谢谢大家.