在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优化
2015-02-05 16:37 1317http://tech.diannaodian.com/dw/ ... -
给表加上聚集索引和非聚集索引
2014-12-11 17:28 695创建简单非聚集索引 以下示例为 Purchasing.Pro ... -
查看表中索引语句
2014-12-11 10:37 673SELECT object_name(object_id) ... -
SQL2008一行转多行的精典写法
2013-08-28 12:06 412--创建测试表 create table t1( id ... -
SQL 2005 with(nolock)详解
2013-06-17 17:03 577大家在写查询时, ... -
用SQL语句查询每门成绩都大于80的学生姓名
2013-05-29 10:39 1717昨天遇到的一个SQL面试题,感觉很有趣。 表名stu 结构 ... -
SqlServer强制断开数据库已有连接的方法
2013-02-22 11:03 1619在master数据库中执行如下代码 declare @i IN ... -
Sql获取第一天、最后一天
2013-01-03 14:56 9671① 本月第一天(--减去今天再加上1天) SELECT DAT ... -
表函数与游标
2012-12-25 16:07 740--建立数据源 create table tb1(zm ch ... -
sql server 2005 输出表的函數用法
2012-12-25 16:02 831view sourceprint? 01 --sql ser ... -
SQL杂谈
2012-12-14 17:33 7191、如何用convert什么的把带有时分秒的日期转为时分秒都0 ... -
用FOR XML PATH将查询结果以XML输出
2012-09-20 17:54 1038本文从此而来 http://www.cnblogs.com/d ... -
left join on and
2012-09-20 10:23 879数据库在通过连接两张或多张表来返回记录时,都会生成一张中间的临 ... -
筛选索引简单使用
2012-08-17 11:29 1148对于在强制实施数据完整性时的一种常见需求,也可以用筛选索引来解 ... -
排名函数(ROW_NUMBER、RANK、DENSE_RANK)及OVER子句
2012-08-10 10:36 6626--在部门内新水排名(如果有相同名次,用dense_rank) ... -
SQL SERVER 中行列转换 PIVOT UNPIVO
2012-08-18 15:34 2327PIVOT用于将列值旋转为列名、同时执行聚合运算(即行转列), ... -
Apply简单使用举例
2012-08-09 17:20 1024APPLY APPLY运算符把右表表达式应用左输入中 ... -
SQL Server 2008语句大全完整版
2012-08-09 10:39 1388--======================== ... -
Not Exists练习
2012-07-23 14:40 886IF OBJECT_ID(N'a') IS NOT NU ... -
Exists练习查找最小缺失值(Missing Value)
2012-07-17 09:34 991第一种方法 USE tempdb; GO IF OBJE ...
相关推荐
在 SQL Server 2005 中,使用公共表表达式(Common Table Expression, CTE)实现递归是一种高效且直观的方式。递归 CTE 通常由两部分构成:定位成员(Anchor Member, AM)和递归成员(Recursive Member, RM)。 1. ...
在SQL Server 2008中实现递归查询来获取所有上级或下级数据是一项非常实用的技术,尤其是在处理具有层次结构的数据时。本篇将详细解释如何利用Common Table Expressions (CTE)来完成这样的查询,并对提供的示例代码...
在SQL查询语言中,`WITH AS`子句是一个非常强大的功能,它允许用户定义一个临时的结果集(通常称为公共表表达式或CTE),这个结果集可以在之后的查询中被引用多次。通过这种方式,`WITH AS`不仅能够简化复杂的查询...
在SQL Server 2005中,`WITH` 关键字是实现递归查询的关键工具,它被用来创建一个临时的结果集,这个结果集可以在同一个查询中被多次引用,这被称为公共表表达式(Common Table Expression,简称CTE)。递归CTE允许...
SQL Server中的递归查询主要通过CTE(公共表表达式)来实现,它是一种非常强大的工具,特别适用于处理层次结构数据。CTE是T-SQL脚本中的临时结果集,可以用于复杂的查询,尤其是需要递归操作的情况。本文将深入探讨...
在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 中的一种新的查询方式,它可以简化复杂的查询过程。 在本文中,我们使用一个树型结构...
在实现递归查询时,CTE通过关键字WITH来建立,遵循特定的语法格式。例如,使用WITH关键字后跟CTE的名称,然后是括号内定义的列名,随后是AS关键字,最后是CTE查询的定义。如果CTE定义中的列名是唯一的,可以省略列名...
在SQL Server中,处理树形数据结构是一种常见的需求,例如组织结构、地区层次或产品分类等。传统的递归方法往往涉及循环,但这可能导致性能问题,尤其是在处理大型数据集时。SQL Server从2005版开始引入了一种新的...
在支持`WITH RECURSIVE`的数据库(如PostgreSQL、SQL Server)中,递归查询的通用语法如下: ```sql WITH RECURSIVE cte_name AS ( -- 初始化子查询(非递归部分) SELECT column1, column2, ... FROM table_...
在SQL Server中,递归查询主要通过公用表表达式(Common Table Expression, CTE)来实现。 CTE是一种临时的结果集,可以在查询语句中引用,用于复杂的查询操作,如递归查询。在递归CTE中,我们定义两个部分:基础...