oracle order siblings by,sql-server – SQL Server相当于Oracle的“CONNECT BY PRIOR”和“ORDER SIBLINGS BY”...

模拟LEVEL列

通过递增递归部分中的计数器可以轻松地模拟级别列:

WITH tree (empid, name, level) AS (

SELECT empid, name, 1 as level

FROM emp

WHERE name = 'Joan'

UNION ALL

SELECT child.empid, child.name, parent.level + 1

FROM emp as child

JOIN tree parent on parent.empid = child.mgrid

)

SELECT name

FROM tree;

模拟兄弟姐妹的顺序

模拟兄弟姐妹的顺序有点复杂.假设我们有一个列sort_order来定义每个父元素的顺序(不是整体排序顺序 – 因为那时不需要兄弟顺序),那么我们可以创建一个列,它给出了一个整体排序顺序:

WITH tree (empid, name, level, sort_path) AS (

SELECT empid, name, 1 as level,

cast('/' + right('000000' + CONVERT(varchar, sort_order), 6) as varchar(max))

FROM emp

WHERE name = 'Joan'

UNION ALL

SELECT child.empid, child.name, parent.level + 1,

parent.sort_path + '/' + right('000000' + CONVERT(varchar, child.sort_order), 6)

FROM emp as child

JOIN tree parent on parent.empid = child.mgrid

)

SELECT *

FROM tree

order by sort_path;

sort_path的表达式看起来很复杂,因为SQL Server(至少是您使用的版本)没有简单的函数来格式化带前导零的数字.在Postgres中,我将使用整数数组,因此不需要转换为varchar – 但这在SQL Server中也不起作用.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值