Sql Serve Transact-SQL 新兵器学习总结之-公用表表达式(CTE).docVIP

Sql Serve Transact-SQL 新兵器学习总结之-公用表表达式(CTE).doc

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
Sql Serve Transact-SQL 新兵器学习总结之-公用表表达式(CTE)

公用表表达式是Sql Server2005新增加的一个非常好用的功能。 公用表表达式 (CTE) 可以认为是在单个 SELECT、INSERT、UPDATE、DELETE 或 CREATE VIEW 语句的执行范围内定义的临时结果集。 CTE 与派生表类似,具体表现在不存储为对象,并且只在查询期间有效。 与派生表的不同之处在于,CTE 可自引用,还可在同一查询中引用多次。 CTE可用于: 1.创建递归查询(我个人认为CTE最好用的地方) 2.在同一语句中多次引用生成的表 CTE优点: 使用 CTE 可以获得提高可读性和轻松维护复杂查询的优点。 查询可以分为单独块、简单块、逻辑生成块。之后,这些简单块可用于生成更复杂的临时 CTE,直到生成最终结果集。 CTE可使用的范围: 可以在用户定义的例程(如函数、存储过程、触发器或视图)中定义 CTE。 下面看一个简单的CTE例题: 把test表中salary最大的id记录保存在test_CTE中,再调用 with?test_CTE(id,salary) as ( ????select?id?,max(salary) ????from?test ????group?by?id ) select?*?from?test_cte 由上面例题可以看出: CTE 由表示 CTE 的表达式名称、可选列列表和定义 CET 的查询组成。 定义 CTE 后, 可以在 SELECT、INSERT、UPDATE 或 DELETE 语句中对其进行引用,就像引用表或视图一样。 简单的说CTE可以替代临时表和表变量的功能。 我个人认为cte最好用的地方是创建递归查询,下面演示一下这功能: 现有一数据结构如下: 这些数据存放在表Co_ItemNameSet中,表结构和部分数据如下: ItemId????? ParentItemId ItemName 2?????????? 0??????????? 管理费用 3?????????? 0??????????? 销售费用 4?????????? 0??????????? 财务费用 5?????????? 0??????????? 生产成本 35????????? 5??????????? 材料 36????????? 5??????????? 人工 37????????? 5??????????? 制造费用 38????????? 35?????????? 原材料 39????????? 35?????????? 主要材料 40????????? 35?????????? 间辅材料 41????????? 36?????????? 工资 42????????? 36?????????? 福利 43????????? 36?????????? 年奖金 现在需求是:我想查询ItemId=2,也就是管理费用和其下属所有节点的信息 通过CTE可以很简单达到需求要的数据 为了体现CTE的方便性,我特意也写了一个sql2000版本的解决方法,先看看sql2000是怎么解决这个问题的 sql2000版本 --sql2000版本 DECLARE?@i?INT SELECT?@i=2; /* 使用临时表作为堆栈来跟踪所有正在处理中的项目(已经开始但尚未结束)。 某个项目一旦处理完毕,将被从堆栈中删除。 当发现新的项目时,这些项目将被添加到堆栈中。 */ CREATE?TABLE?#tem( [ItemId]?[INT]??NOT?NULL, [level]?INT ); /* 存放结果 */ CREATE?TABLE?#list( [ItemId]?[INT]??NOT?NULL, [ParentItemId]?[INT]?NOT?NULL?DEFAULT?((0)), [ItemName]?[nvarchar](100)?NOT?NULL?DEFAULT?(), [level]?INT ); INSERT?INTO?#tem([ItemId],[level]) SELECT??ItemId,?1 FROM??Co_ItemNameSet WHERE?itemid=@i?? INSERT?INTO?#list([ItemId],[ParentItemId],[ItemName],[level]) SELECT??ItemId,?ParentItemId,?ItemName?,1 FROM??Co_ItemNameSet WHERE?itemid=@i?? DECLARE?@level?INT SELECT?@level=1 DECLARE?@current?INT SELECT?@current=0 /* 当?@level?大于?0?时,执行以下步骤:

文档评论(0)

canggu808866 + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档