sql server2005的公式表表达式(cte)

这是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
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值