`
ljzforever
  • 浏览: 114846 次
  • 性别: Icon_minigender_1
  • 来自: 武汉
社区版块
存档分类
最新评论

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

    博客分类:
  • sql
阅读更多
这是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
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics