WEB开发网
开发学院数据库MSSQL Server SQL2005/2008中的CTE应用--递归查询 阅读

SQL2005/2008中的CTE应用--递归查询

 2009-10-25 00:00:00 来源:WEB开发网   
核心提示: 查询结果:C_NameC_ParentNameC_ParentCode分类5分类22分类8分类52/5当然,我们不是说CTE就是万能的,SQL2005/2008中的CTE应用--递归查询(4),通过好的表设计也可以某种程度上解决特定的问题,下面用常规的SQL实现上面这个需求,二、 这个应用示例重

查询结果:

C_Name    C_ParentName    C_ParentCode
分类5    分类2    2
分类8    分类5    2/5

当然,我们不是说CTE就是万能的。通过好的表设计也可以某种程度上解决特定的问题。下面用常规的SQL实现上面这个需求。

注意:上面表中有一个字段很重要,就是C_Code,编码 ,格式如"1/2",“2/5/8"表示该分类的上级分类是1/2,2/5/8

这样,我们查询就简单多,查询以PKID为2的分类包含所有子分类:

SELECT C_Name as C_Name, (Select top 1 C_Name from CategorySelf s where c.C_Parent=s.PKID) as C_ParentName,C_Code as C_ParentCode
from CategorySelf c where C_Code like '2/%'

查询以PKID为2的分类包含所有子分类,且级别不大于3

SELECT C_Name as C_Name, (Select top 1 C_Name from CategorySelf s where c.C_Parent=s.PKID)  as C_ParentName,C_Code as C_ParentCode
from CategorySelf c where C_Code like '2/%' and C_Level<=3

查询结果同上,略去。这里我们看出,有时候,好的表结构设计相当重要。

邀月于2009.10.23 1:36 完成分享。

有人很关心性能问题。目前没有测试过。稍后会附上百万级测试报告。不过,有两点理解邀月忘了补充:

一、CTE其实是面向对象的,运行的基础是CLR。一个很好的说明是With查询语句中是区分字段的大小写的。即"C_Code"和"c_Code"是不一样的,后者会报错。这与普通的SQL语句不同。

二、 这个应用示例重在简化业务逻辑,即便是性能不佳,但对临时表\表变量\游标等传统处理方式是一种业务层次上的简化或者说是优化。

上一页  1 2 3 4 

Tags:SQL CTE 应用

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接