`

在sql server中利用with as实现递归功能

 
阅读更多

在sqlserver2005之前,要实现递归功能比较麻烦,比如可能会要用到临时表与while语句来循环。自sqlserver2005之后,新增了with as功能语法,即 公用表达式(CTE),让递归实现起来变的简单了。

本章我们主要演示如何利用with as功能实现一个简单的递归功能。



--开始实例演示--

先创建一个仓库表,表名为Storage_Depository,该表有三个字段:DID(仓库编号),DName(仓库名称),PID(父仓库编号).
通过这样一个简单表,就可以将所有仓库信息,通过DID与PID字段来创建一个树型结构。
创建表的sql语句:
Create table Storage_Depository
(
DID varchar(50) not null primary key,
DName varchar(50) not null,
PID varchar(50) null
)



然后往该表插入演示数据:

insert into Storage_Depository(DID,DName,PID) 
select 'A','A仓库',null 
union all
select 'A-1','A-1仓库','A' 
union all
select 'A-2','A-2仓库','A' 
union all
select 'A-1-1','A-1-1仓库','A-1' 
union all
select 'B','B仓库',null 




从上面的数据可以看的出来,A的子仓为A-1与A-2仓,而A-1-1为A-1的子仓,B仓是一个独立的仓库,与A仓平级。
下面,我们通过with as功能,查出A仓下面的所有子仓:


with w_Storage_Depository as
(
select DID,DName,PID from Storage_Depository where DID='A'
union all
select A.DID,A.DName,A.PID from Storage_Depository A,w_Storage_Depository B where A.PID=B.DID
)
select * from w_Storage_Depository




代码很简短,也非常容易让人理解.

反过来,比如我们要查出A-1-1仓的所有上级仓,稍稍改一下上面的sql语句就可以了:


with w_Storage_Depository as
(
select DID,DName,PID from Storage_Depository where DID='A-1-1'
union all
select A.DID,A.DName,A.PID from Storage_Depository A,
w_Storage_Depository B where A.DID=B.PID
)
select * from w_Storage_Depository
分享到:
评论

相关推荐

    sql server 2005中使用with实现递归的方法

    WITH fw_requestion_note_temp(old_apply_id) AS ( –取根节点放入临时表 SELECT old_apply_id FROM fw_requestion_note –WHERE old_apply_id = ‘e741470e-8b5c-4f91-9b03-c7474d103aef’ –根据已取到的数据递归...

    SQLserver2008使用表达式递归查询

    代码如下:–由父项递归下级 with cte(id,parentid,text) as (–父项 select id,parentid,text from treeview where parentid = 450 union all –递归结果集中的下级 select t.id,t.parentid,t.text from treeview as...

    SqlServer实现递归查询

    在一般的系统开发中,我们经常遇到一类问题:查询出某条记录以及与该条记录相关的其他记录。例如,现在需要查询出西湖区以及西湖区所属的市和省,这时候就需要用到SQL递归查询。我在这里构造了一张数据表[tb_Test],...

    SQL Server中with as使用介绍

     WITH AS短语,也叫做子查询部分(subquery factoring),可以让你做很多事情,定义一个SQL片断,该SQL片断会被整个SQL语句所用到。有的时候,是为了让SQL语句的可读性更高些,也有可能是在UNION ALL的不同部分,...

    SQL Server 通过with as方法查询树型结构

    可以在一个语句中多次引用公用表表达式,使其更加简洁 二、非递归的公共表达式  可以是定义列或自动列和select into 效果差不多 --指定列 with withTmp1 (code,cName) as ( select id,Name from ClassUnis ) ...

    SQL实现递归及存储过程中In()参数传递解决方案详解

    在SQL Server中,我们可以利用表表达式来实现递归算法,一般用于阻止机构的加载及相关性处理。 –>实现: 假设OrganiseUnit(组织机构表)中主要的三个字段为OrganiseUnitID(组织机构主键ID)、...

    sqlserver实现树形结构递归查询(无限极分类)的方法

    SQL Server 2005开始,我们可以直接通过CTE来支持递归查询,CTE即公用表表达式 百度百科 公用表表达式(CTE),是一个在查询中定义的临时命名结果集将在from子句中使用它。每个CTE仅被定义一次(但在其作用域内可以被...

    使用SqlServer CTE递归查询处理树、图和层次结构

    递归CTE是SQL SERVER 2005中重要的增强之一。一般我们在处理树,图和层次结构的问题时需要用到递归查询。 CTE的语法如下 WITH CTE AS ( SELECT EmpId, ReportTo, FName FROM Employ WHERE Emp

    sql server递归子节点、父节点sql查询表结构的实例

    WITH dept AS ( SELECT * FROM dbo.deptTab --部门表 WHERE pid = @id UNION ALL SELECT d.* FROM dbo.deptTab d INNER JOIN dept ON d.pid = dept.id ) SELECT * FROM dept 二、查询当前部门所有上级部门...

    SQL Server 树形表非循环递归查询的实例详解

    很多人可能想要查询整个树形表关联的内容都会通过循环递归来查…事实上在微软在SQL2005或以上版本就能用别的语法进行查询,下面是示例。 --通过子节点查询父节点 WITH TREE AS( SELECT * FROM Areas WHERE id = 6 ...

    有关数据库SQL递归查询在不同数据库中的实现方法

    本文给大家介绍有关数据库SQL递归查询在不同数据库中的实现方法,具体内容请看下文。 比如表结构数据如下: Table:Tree ID Name ParentId 1 一级 0 2 二级 1 3 三级 2 4 四级 3 SQL SERVER 2005查询方法: ...

    SqlServer使用公用表表达式(CTE)实现无限级树形构建

    SQL Server 2005开始,我们可以直接通过CTE来支持递归查询,CTE即公用表表达式 公用表表达式(CTE),是一个在查询中定义的临时命名结果集将在from子句中使用它。每个CTE仅被定义一次(但在其作用域内可以被引用任意...

    SQLSERVER2005 中树形数据的递归查询

    问题描述。借用了adinet的问题。...今天做项目遇到一个问题, 有产品分类A,B,C顶级分类, 期中A下面有a1,a2,a3子分类. 但是a1可能共同属于A和B,然后我...呵呵,解决方案 代码如下: with cte as (select * from tb where id=’

    sql server

    CET递归实例 with splitCTE as

    mysql数据库的基本操作语法

    MySQL中约束保存在information_schema数据库的table_constraints中,可以通过该表查询约束信息; 约束主要完成对数据的检验,保证数据库数据的完整性;如果有相互依赖数据,保证该数据不被删除。 常用五类约束: ...

Global site tag (gtag.js) - Google Analytics