SQL Server2005数据库查询中使用CTE

Builder.com.cn

通用表表达式(CTEs)是SQLServer2005的一项新功能。它们类似于alias(如在SELECTT1.*FROMMyTableT1中),不过功能更为强大。本质上,CTE是一个临时结果集,它仅仅存在于它发生的语句中。您可以在SELECT、INSERT、DELETE、UPDATE或CTEATEVIEW语句中建立一个CTE。CTE类似于派生表,但拥有几项优点。

CTE的优点

与派生表不同,CTE能够引用自己本身。如果您不必存储视图,您可以用一个CTE来代替它。在一个语句中,您还可以多次引用CTE。应用CTE,您可以通过一个派生栏对结果进行分组。

之前,我曾写过有关原子和分子查询的文章。原子查询建立一个表,而分子查询建立在原子查询之上,提供清晰与重复利用。应用CTE也可以达到同样的目的。您可以将查询区域分割成可读的“块”,然后用这些块建立一个复杂的查询。执行递归查询是CTE最重要也是最强大的功能。

建立CTE

CTE通过关键字WITH建立,其模板为:

WITHCTE_name[(column_name[,...n])]AS(CTE_query_specification)

如果在CTE定义中提到的栏名称是唯一的,那么您可以不必给它们命名。不过,您同样也可以对它们重新命名。

下面的例子应用到SQLServer2005中的AdventureWorks样本数据库。这个数据库被高度规格化,因此需要几个连接来集合与雇员有关的信息。视图简化了这一操作,但也收集了所有有关雇员的信息,而您可能仅仅需要其中一部分资料。

AdventureWorks的雇员数据分布在几个表中;而且,雇员与经理被存储在同一个表中(HumanResources.Employee),而他们的姓名(及其它数据)则存储在Person.Contact表中,这使得这个问题更加复杂。

首先,我们建立一个恢复雇员姓名的CTE。

WITHcte_EmployeeAS(SELECTe.EmployeeID,c.FirstName,c.MiddleName,c.LastName,e.TitleASJobTitle,c.Phone,e.ManagerIDFROMHumanResources.EmployeeASeINNERJOINPerson.ContactAScONc.ContactID=e.ContactID)

然后,我们可从CTE中选择一栏或几栏,就像它是一个标准的表或视图。

接着我们再进一步。我们需要雇员和他们经理的姓名,于是我们使用CTE两次,把它自身连接起来。下面是完整的查询代码:

WITHcte_EmployeeAS(SELECTe.EmployeeID,c.FirstName,c.MiddleName,c.LastName,e.TitleASJobTitle,c.Phone,e.ManagerIDFROMHumanResources.EmployeeASeINNERJOINPerson.ContactAScONc.ContactID=e.ContactID)SELECTE.FirstName+''E.LastNameEmployee,M.FirstName+''M.LastNameManagerFROMcte_EmployeeASELEFTOUTERJOINcte_EmployeeASMONE.ManagerID=M.EmployeeID

限制:不能在一个语句中建立两个CTE。

总结

CTE是SQLServer2005的一项强大而灵活的功能。它使得SQLServer的可读性更强,更易于管理,降低了查询的复杂程度。如上所述,您可以在一个SQLServer语句中多次应用CTE。

转载自:http://www.yixia.net/2/172366.html

转载于:https://blog.51cto.com/3241170/612111

SQL SERVER 2005 CTE(通用表达式)相关推荐

  1. 在Sql Server 2005使用公用表表达式CTE简化复杂的查询语句

    公用表表达式CTE是Sql Server 2005引入的一种新的表表达式.CTE在许多方面都类似于派生表.逻辑上CTE是一个临时结果集,它仅仅存在于它发生的语句中.您可以在SELECT.INSERT. ...

  2. SQL SERVER 2005 中的CTE

    SQL Server 2005中有一种新的语法叫做通用表表达式,CTE(Common Table Expression). 这种语法的好处就是可以创建出一张临时的表,这张表可以在定义中使用自引用,使得 ...

  3. SQL Server中公用表表达式 CTE 递归的生成帮助数据,以及递归的典型应用

    原文: SQL Server中公用表表达式 CTE 递归的生成帮助数据,以及递归的典型应用 本文出处:http://www.cnblogs.com/wy123/p/5960825.html 我们在做开 ...

  4. 无废话-SQL Server 2005新功能(1) - TSQL

    无废话-SQL Server 2005新功能(1) - TSQL SQL Server 2005相对于SQL Server 2000改进很大,有些还是非常实用的. 举几个例子来简单说明 这些例子我引用 ...

  5. SQL SERVER 2005 T_SQL新的特性以及解决并发

    一.修改语句的增强 UPDATE test SET tname.WRITE('one hundred and two', 9, 3) WHERE tid = 102 在2005中增强了update方法 ...

  6. SQL Server 2005新特性之使用with关键字解决递归父子关系

    1. 引言 现实项目中经常遇到需要处理递归父子关系的问题,如果把层次关系分开,放在多个表里通过主外键关系联接,最明显的问题就是扩展起来不方便,对于这种情况,一般我们会创建一个使用自连接的表来存放数据. ...

  7. SQL Server 2005 正则表达式使模式匹配和数据提取变得更容易

    目录 CLR 用户定义函数 模式匹配 数据提取 模式存储 匹配 在匹配项中进行数据提取 总结 尽管 T-SQL 对多数数据处理而言极其强大,但它对文本分析或操作所提供的支持却很少.尝试使用内置的字符串 ...

  8. 打破第一范式的要求 (中英对照)Michael Rys 对 SQL Server 2005 中XML 的 评论——对微软SQL Server项目经理Michael Rys博士的采访

    Michael Rys on XML in SQL Server 2005 Michael Rys对SQL Server 2005中XML的评论 Michael Rys is one of two p ...

  9. SQL Server 2005 中的商务智能和数据仓库

    微软发布了SQL Server 2005,对于微软与BI来说这是一个非常重要的版本,它完善了微软在BI方面的产品线.SQL Server 2005以及 Visual Studio .net2005的整 ...

最新文章

  1. Python 词云玩一下
  2. 入门讲解HTML5的画布功能(1)
  3. Outlook 2010如何更改脱机缓存数据OST文件位置?
  4. mysql 主从同步检查_MySQL主从复制一致性检测
  5. [Windows驱动开发](一)序言
  6. vue 实现 web端滚动刷新 自定义指令
  7. Halcon例程详解 (深度图转换为3D图像)—— xyz_attrib_to_object_model_3d
  8. 计算机仿真随机数生成,伪随机数生成器研究
  9. matlab ext2int,MATLAB程序解读。急急急急急!!!!!!!!!!!
  10. 英伟达各版本CUDA地址以及与驱动对应关系
  11. 武汉大学计算机学院易碧波,王峰(武汉大学计算机学院副教授)_百度百科
  12. 图形学知识基础:三维变换,旋转(欧拉角旋转与万向锁,绕任意轴旋转,四元数)
  13. MVP模式基本用例开发
  14. 显示设备的接口分类:VGA,HDMI,DVI等等
  15. vtk中的win32窗口
  16. 117道Java面试题及答案(大多都是项目里面所用到的技术点)
  17. Linux文件写入读取与关闭(二)
  18. pointpillars--kitti训练
  19. html 如何去掉超链接下的下划线
  20. 计算机专业培训策划案,电脑培训策划书

热门文章

  1. 写文章 使用conda管理python环境
  2. MYSQL 练习题
  3. MySQL数据库学习笔记(十一)----DAO设计模式实现数据库的增删改查(进一步封装JDBC工具类)...
  4. C#里面Console.Write与Console.WriteLine有什么区别????
  5. Socket发完消息后,立即关闭连接,客户端丢失数据的问题
  6. 你是一个职业的页面重构工作者吗?
  7. Failed to resolve: com.android.support:appcompat-v7:27.+ 报错解决方法
  8. Swift - 异常处理
  9. Linux 中ifconfig和ip addr命令查看不到ip解决方法
  10. 解决QT无法调试问题-----the cdb process terminated