这是sql2005新增的语法,是为了更好的解决复杂查询中的性能问题,是来代替临时表和表变量的:
WITH
a AS
(
SELECT * FROM sysobjects
)
select * from a
在上面,
WITH
a AS
(
SELECT * FROM sysobjects
)
表示将SELECT * FROM sysobjects查出的结果放到a中
select * from a表示从上一个查询结果中作筛选
上面这只是个小例子,最常用的地方是递归查询
比如有这样的一张表:
tab_data
id node_name parent_id
1 辽宁省 0
2 湖北省 0
3 沈阳市 1
4 大连市 1
5 武汉市 2
6 仙桃市 2
7 大东区 4
8 沈河区 4
9 铁西区 4
10 青山区 5
11 武昌区 5
一张典形的树形表,如果想查辽宁省的资料,怎么查?
如果还用Sql2000的语法,就会很复杂,游标,临表等,但是用新的语法,就很简单:
with
data as
(
select * from tab_data where id=1
union all
select tab_data.* from tab_data,data where tab_data.parent_id=data.id
)
select * from data
其中:select * from tab_data where id=1
是查出辽宁省的资料,查出第一个结果集
select tab_data.* from tab_data,data where tab_data.parent_id=data.id
是会根据从上一个查询结果集中获得的id值来查询parent_id字段的值
union all
会不断的把查出的结果集合并,
后面的一个查询会自己不断的循环执行,对表中的还没有进入前面结果集的数据集再进行一次查询,然后不断的与前面的结果集合并,直到查不出结果,就停止执行,最终data结果集就是最终的结果集,然后用:
select * from data查出全部
有人会问:后面的一个查询为什么会自己循环执行,我的理解是:这就是语法,没有为什么,等我用的很熟了,再来研究这是为什么吧~
这里有几篇很好的介绍的文章:
http://www.blogjava.net/nokiaguy/archive/2009/nokiaguy/archive/2009/nokiaguy/archive/2009/01/31/252787.html
http://www.blogjava.net/nokiaguy/archive/2009/02/01/252890.html
http://www.cnblogs.com/aierong/archive/2008/07/31/1257250.html
分享到:
相关推荐
SQL Server 2005 杂谈 公用表表达式 CTE 递归调用 doc SQL Server 2005 杂谈 公用表表达式 CTE 递归调用 doc
SQL Server 2005 杂谈 使用 公用表表达式 CTE 简化 嵌套 SQL SQL Server 2005 杂谈 使用 公用表表达式 CTE 简化 嵌套 SQL
CTE是在内存中准备好数据,而不是每次一条往返服务器和客户端一次。如果需要再插入到临时表...这篇文章主要介绍了sql server使用公用表表达式CTE通过递归方式编写通用函数自动生成连续数字和日期 ,需要的朋友可以参考下
主要介绍了SQL Server 公用表表达式(CTE)实现递归的方法,需要的朋友可以参考下
详细描述在sqlserver 2005 中通过使用CTE 实现递归的方法
SQL Server 2005开始,我们可以直接通过CTE来支持递归查询,CTE即公用表表达式 公用表表达式(CTE),是一个在查询中定义的临时命名结果集将在from子句中使用它。每个CTE仅被定义一次(但在其作用域内可以被引用任意...
本书是Inside Microsoft SQL Server ...第4章 子查询、表表达式和排名函数 第5章 联接和集合操作 第6章 聚合和旋转数据 第7章 TOP和ALLPY 第8章 数据修改 第9章 图、树、层次结构和递归查询 附录A 逻辑难题 索引
SQLserver CTE With 使用with产出临时表,在根据临时表二次查询
【SQL SERVER 新增的几个小功能】 1. 分页查询数据 2、增加异常处理 try ... catch 3、通用表达式CTE,可以简化嵌套SQL
SQL SERVER的CTE用法,包括列值计算等
本文实例讲述了mysql8 公用表表达式CTE的使用方法。分享给大家供大家参考,具体如下: 公用表表达式CTE就是命名的临时结果集,作用范围是当前语句。 说白点你可以理解成一个可以复用的子查询,当然跟子查询还是有点...
公用表表达式 (CTE) 可以认为是在单个 SELECT、INSERT、UPDATE、DELETE 或 CREATE VIEW 语句的执行范围内定义的临时结果集。 CTE 与派生表类似,具体表现在不存储为对象,并且只在查询期间有效。 与派生表的不同之处...
5.2 公用表表达式(CTE) 5.3 视图 5.4 内联表值函数 5.5 APPLY运算符 5.6 总结 5.7 练习 5.8 解决方案 第6章 集合运算 6.1 UNION(并集)集合运算 6.2 INTERSECT(交集)集合运算 ...
关于使用CTE(公用表表达式)的递归查询—-SQL Server 2005及以上版本 公用表表达式 (CTE) 具有一个重要的优点,那就是能够引用其自身,从而创建递归 CTE。递归 CTE 是一个重复执行初始 CTE 以返回数据子集直到获取...
下面是一个简单的Family Tree 示例: 代码如下: DECLARE @TT TABLE (ID int,Relation varchar(25),Name varchar(25),ParentID int) INSERT @TT SELECT 1,’ Great GrandFather’ , ‘Thomas Bishop’, null UNION ...