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 :
本文来源:不详 作者:佚名