从SQL Server数据库中查询一张有父子关系表的数据时候,我们可能需要知道每一条数据的层级,这个需求当然可以先将数据查出来后再在程序中通过递归获得,不过SQL Server数据库可以通过with as直接获得每一条数据的层级值,并且通过一个自定义字段返回。
1、如图,我们查询下面的地区表数据时候,同时取得其层级
2、实现代码
WITH tree AS (
SELECT
name,
code,
parent_code,
lev = 0 -- 定义层级字段,并且设置顶级的值
FROM
weker_region
WHERE
name = '浙江省' -- 顶级数据条件,比如此处设置条件为浙江省,那么只查询浙江省及其下属各级别所有的地区
UNION ALL
SELECT
b.name,
b.code,
b.parent_code,
lev = tree.lev + 1 -- 递归中每下去一级层级就+1
FROM
tree
INNER JOIN weker_region b ON tree.code = b.parent_code
) SELECT
*
FROM
tree
ORDER BY
tree.lev
OPTION (MAXRECURSION 0); -- 该处设置最大递归次数,默认是100,设置为0则递归次数不限
3、执行结果如图
4、需要注意的是,如果数据量特别大,执行时间会特别长,如只查询浙江省及其下属各级地区,大概零点几秒左右,但是查询中国下属三千多各级地区的话,反正几百秒秒都还没有跑完。
参考文章:
1、SQL中的with as的使用
2、语句被终止。完成执行语句前已用完最大递归 100