您的位置:首页 > 博客中心 > 数据库 >

SQL SERVER With语法[转]

时间:2022-03-14 03:59

今天在论坛上看到一个举例,关于sql server 的示例。1/25/50/100美分,多少种可能拼凑成2美元。

    看了其中第一条语法,放在SQL SERVER中测试,发现真的列举出所有组合成2美元的方式。

   于是仔细研究语法,发现用了With关键字。

gxlsystem.com,布布扣

 

   发现很长时间没有使用SQL SERVER数据库,真的有点落后了。于是见到那学习了下 With关键字。

1.引言

 

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

 

列名描述
location_id 地区编号
location_name 地区名称
parentlocation_id 上级地区编号

 

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

 

列名描述
employee_id 职员编号
employee_name 职员名称
manager_id 职员的直接上级管理者,和employee_id进行自联接

 

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

2. 分析

 

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

gxlsystem.com,布布扣

最后需要在前台界面将其显示出来,由于记录已经按层次返回,需要做的就是按层次首其输出,首先将第0层数据输出,接下来将遍历第0层数据,将第一层 数据添加到合适的父对象中,重复此过程直到填充结果。那么这里的难题就在于如何查找父对象,我们当然可以遍历集合,但是这么做的话如果数据量很大将导致效 率低下。既然可以得到当前对象所位于的层的信息,就也是这树倒置的树是一层一层向下填充的,我们可以定义一个临时集合变量,存储当前层上一层的所有父对 象,在插入当前层对象时遍历集合变量以插入到合适的位置,同时我们还必须保证在逐层读取数据时临时集合变量中持有的始终时当前层上一层所有的对象,程序流 程图如下所示:

gxlsystem.com,布布扣

2. exec pr_GetLocations

gxlsystem.com,布布扣gxlsystem.com,布布扣

热门排行

今日推荐

热门手游