在sql server中利用with as实现递归功能
在sqlserver2005之前,要实现递归功能比较麻烦,比如可能会要用到临时表与while语句来循环。自sqlserver2005之后,新增了with as功能语法,即 公用表达式(CTE),让递归实现起来变的简单了。
本章我们主要演示如何利用with as功能实现一个简单的递归功能。
--开始实例演示--
先创建一个仓库表,表名为Storage_Depository,该表有三个字段:DID(仓库编号),DName(仓库名称),PID(父仓库编号).
通过这样一个简单表,就可以将所有仓库信息,通过DID与PID字段来创建一个树型结构。
创建表的sql语句:
Sqlserver代码
Create table Storage_Depository
(
DID varchar(50) not null primary key,
DName varchar(50) not null,
PID varchar(50) null
)
然后往该表插入演示数据:
Sqlserver代码
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仓下面的所有子仓:
Sqlserver代码
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语句就可以了:
Sqlserver代码
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 中,使用公共表表达式(Common Table Expression, CTE)实现递归是一种高效且直观的方式。递归 CTE 通常由两部分构成:定位成员(Anchor Member, AM)和递归成员(Recursive Member, RM)。 1. ...
在SQL Server 2008中实现递归查询来获取所有上级或下级数据是一项非常实用的技术,尤其是在处理具有层次结构的数据时。本篇将详细解释如何利用Common Table Expressions (CTE)来完成这样的查询,并对提供的示例代码...
SQL Server中的递归查询主要通过CTE(公共表表达式)来实现,它是一种非常强大的工具,特别适用于处理层次结构数据。CTE是T-SQL脚本中的临时结果集,可以用于复杂的查询,尤其是需要递归操作的情况。本文将深入探讨...
在SQL查询语言中,`WITH AS`子句是一个非常强大的功能,它允许用户定义一个临时的结果集(通常称为公共表表达式或CTE),这个结果集可以在之后的查询中被引用多次。通过这种方式,`WITH AS`不仅能够简化复杂的查询...
在SQL Server 2005中,`WITH` 关键字是实现递归查询的关键工具,它被用来创建一个临时的结果集,这个结果集可以在同一个查询中被多次引用,这被称为公共表表达式(Common Table Expression,简称CTE)。递归CTE允许...
在SQL中,`WITH`语句,也称为公共表表达式(Common Table Expression,简称CTE),是一种非常有用的工具,特别是在处理递归查询时。它允许我们定义一个临时的结果集,这个结果集可以在同一个查询中被多次引用,提高...
ORGNAME,T.P_ORGDICTID,T.F_PARENTID FROM T_SYS_ORGDICT AS T INNER JOIN CTE AS C ON T.F_PARENTID=C.P_ORGDICTID`)则将当前CTE的结果与原表进行连接,寻找所有父ID在CTE结果中的记录,从而实现递归。 3. **临时...
在SQL Server中,`WITH AS` 语句,也称为公用表表达式(Common Table Expression,简称CTE),是一种强大的工具,它允许我们为复杂的查询创建临时的结果集,这个结果集可以在同一个查询中多次引用。这极大地提高了...
在进行Oracle到SQL Server的迁移过程中,需要特别关注上述几个方面。尽管这两种数据库系统在许多方面具有相似性,但也存在显著差异。了解这些差异并采取适当的转换策略对于确保迁移成功至关重要。通过遵循上述指导...
- **MS SQL Server** 和 **PostgreSQL** 都支持事务处理,但两者在实现细节上有所区别,如锁定机制、隔离级别等。 #### 动态 SQL - 两者都支持动态 SQL,但语法和实现细节有所不同。 #### SELECT INTO 变量或行/...
在一般的系统开发中,我们经常遇到一类问题:查询出某条记录以及与该条记录相关的其他记录。例如,现在需要查询出西湖区以及西湖区所属的市和省,这时候就需要用到SQL递归查询。我在这里构造了一张数据表[tb_Test],...
在SQL Server中,实现树形结构递归查询是数据库管理中的常见需求,特别是在处理具有层级关系的数据时,如无限级分类。SQL Server 2005及以后版本引入了公用表表达式(CTE,Common Table Expression)来支持递归查询...
本文主要介绍了 SQL Server 2005 中公用表表达式(CTE)的递归调用,用于解决树型结构数据的查询问题。CTE 是 SQL Server 2005 中的一种新的查询方式,它可以简化复杂的查询过程。 在本文中,我们使用一个树型结构...
在支持`WITH RECURSIVE`的数据库(如PostgreSQL、SQL Server)中,递归查询的通用语法如下: ```sql WITH RECURSIVE cte_name AS ( -- 初始化子查询(非递归部分) SELECT column1, column2, ... FROM table_...
在实现递归查询时,CTE通过关键字WITH来建立,遵循特定的语法格式。例如,使用WITH关键字后跟CTE的名称,然后是括号内定义的列名,随后是AS关键字,最后是CTE查询的定义。如果CTE定义中的列名是唯一的,可以省略列名...
在SQL Server中,处理树形数据结构是一种常见的需求,例如组织结构、地区层次或产品分类等。传统的递归方法往往涉及循环,但这可能导致性能问题,尤其是在处理大型数据集时。SQL Server从2005版开始引入了一种新的...
在SQL Server中,递归查询主要通过公用表表达式(Common Table Expression, CTE)来实现。 CTE是一种临时的结果集,可以在查询语句中引用,用于复杂的查询操作,如递归查询。在递归CTE中,我们定义两个部分:基础...