CTE WITH Recrusive

CTE函数处理递归(WITH语法)

我们在做分类处理的时候,总会遇到递归的处理,比如说地区就是一个例子,中国--北京--西城区,我们可以把这样的信息存储在一个数据表中,用ParentID区分根节点和叶子节点。假如我们要做导航,得到了”西城区”,但是还要得到他的父级,或夫父级,一种方式是用程序来处理,也是很简单,另一种方式就是用数据库的功能。既然数据库能完成这件事,何必在用程序呢?

     在SqlServer2005以前的版本中,也能处理这种情况,不过当时用的是存储过程,代码也比较多,表设计的时候,还的加一个表示“深度”的字段,当时我也写过相关的文章,参见:

存储过程实现无限级分类(1)

存储过程实现无限级分类(2)

存储过程实现无限级分类(3)

    但是,在学习SqlServer2005新加的特性的时候,注意到WITH语句能实现这样的功能,并且代码简单,简练,最重要的是好理解。

下面是一张递归的表结构图:

Recursive_1

里边的parentID记录的就是他们之间的关系;

比如我们要查询id = 10008,并且parentID 为10008的数据怎么办呢?如:

Recursive_3

呵呵,不留悬念了,直接上代码吧!其实挺容易理解的:

WITH CategoryInfo AS(

SELECT id,text,parentid FROM Recursive WHERE id = 10008

UNION ALL

SELECT a.id,a.text,a.parentid FROM Recursive AS a,CategoryInfo AS b WHERE a.parentid = b.id

)

SELECT * FROM CategoryInfo

 

看看是不是简单,简练,好理解!

赶快试试吧!

这是从上向下查,如果从下向上查,怎么查呢,自己举一反三吧!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值