天下网吧 >> 网吧天地 >> 网吧技术 >> 网吧软件 >> 正文

SQL Server 2005新特性之使用with关键字解决递归父子关系

2008-12-23不详佚名

1. 引言

  现实项目中经常遇到需要处理递归父子关系的问题,如果把层次关系分开,放在多个表里通过主外键关系联接,最明显的问题就是扩展起来不方便,对于这种情况,一般我们会创建一个使用自连接的表来存放数据。例如存放会员地区数据表结构可能是这样:

列名  

描述  

location_id  

地区编号  

location_name  

地区名称  

parentlocation_id  

上级地区编号  

或者某个部分的职员表结构可能如下所示:

列名  

描述  

employee_id  

职员编号  

employee_name  

职员名称  

manager_id  

职员的直接上级管理者,和 employee_id 进行自联接  

通过类似表结构,我们就可以通过一个表理论上管理无限级数的父 / 子关系,但是当我们需要将这些数据读取出来,不论是填充到一个树中,或是使用级联显示出来,需要花费一定的精力。传统的做法,是做一个递归调用,首先连接数据库将顶层数据(也就是 parent_xxx null 的记录)读取出来,再对每一条数据进行递归访问填充集合,这种做法需要连接数据库多次,显然不是较好的解决方法,那么我们能不能通过一次数据库访问,将数据全部读取出来,并且为了按照父子关系形成集合,使返回的数据满足某种格式。

2. 分析

理想情况下,如果父 / 子关系数据时严格按照关系结构添加到数据库中,亦即首先添加某条父记录,接着添加该父记录的子记录,如果子记录还包含子记录的话继续添加,最终数据表中父 / 子关系按规则排列数据,我们就可以使用某种算法填充集合,但是正如我们所说,这是理想情况,实际情况下数据经常会发生改变,导致数据没有规律可言,如下图所示,这样的话读取数据填充集合就不太容易的。

所以我们要做的就是通过查询使数据库返回的数据满足这种格式,那么我们的思路是首先查找顶层( 0 层)记录,再查询第 1 层记录,接下来是第 2 层、第 3 层直到第 n 层。因为层数是不确定的,所以仍然需要使用递归访问。

SQL Server 2005 中提供了新的 with 关键字,用于指定临时命名的结果集,这些结果集称为公用表表达式( CTE )。该表达式源自简单查询,并且在 SELECT INSERT UPDATE DELETE 语句的执行范围内定义。该子句也可用在 CREATE VIEW 语句中,作为该语句的 9 7 3 1 2 3 4 5 6 7 4 8 :

本文来源:不详 作者:佚名

声明
声明:本站所发表的文章、评论及图片仅代表作者本人观点,与本站立场无关。文章是出于传递更多信息之目的。若有来源标注错误或侵犯了您的合法权益,请作者持权属证明与本网联系,我们将及时更正、删除,谢谢。 Email:support@txwb.com,系统开号,技术支持,服务联系微信:_WX_1_本站所有有注明来源为天下网吧或天下网吧论坛的原创作品,各位转载时请注明来源链接!
天下网吧·网吧天下
  • 本周热门
  • 本月热门
  • 阅读排行