Sql Server 公用表达式(CTE)
简介
对于select查询语句来说,通常情况下,为了使T-SQL代码更加简洁和可续,在一个查询中引入另外的结果集都是通过视图而不是子查询来进行分解的,但是,视图是作为系统对象存在数据库中,那对于结果集仅仅需要在存储过程或是用户自定义函数中使用一次的时候,使用视图就显得有些奢侈了。
公用表表达式(Common Table Expression)是SQL SERVER 2005版本之后引入的一个特性.CTE可以看作是一个临时的结果集,可以在接下来的一SELECT,INSERT,UPDATE,DELETE,MERGE语句中被多次引用。使用公用表达式可以让语句更加清晰简练.
公用表表达式其实提供的功能和视图差不多,但是它不像视图一样把sql语句保存在我们的数据库里面。虽然CTE不是必需的,但是它可以为提高sql的可读性
微软官方给的使用CET的优势:
- 编写一个递归查询(类似树查询)
- 使用要使用一个类似视图的功能,但是又不想把这个查询sql语句的定义保存在数据库
- 要引用一个返回数据sql语句多次,只需要定义一次。
公用表达式的定义非常简单,只包含三部分:
- 公用表表达式的名字(在WITH之后)
- 所涉及的列名(可选)
- 一个SELECT语句(紧跟AS之后)
WITH expression_name [(column_name [,...n] )] AS (
cte_query_definition
)
按照是否递归,可以将公用表(CTE)表达式分为递归公用表表达式和非递归公用表表达式.非递归公用表表达式(CTE)
非递归公用表表达式(CTE)是查询结果仅仅一次性返回一个结果集用于外部查询调用。并不在其定义的语句中调用其自身的CTE
比如一个简单的非递归公用表表达式:
公用表表达式的好处之一是可以在接下来一条语句中多次引用:
with cte_name as ( select * from Sys_Log ) select * from cte_name a inner join cte_name b on a.f_id=b.f_id
由于CTE只能在接下来一条语句中使用,如果使用多次会提升cte名称无效
因此,当需要接下来的一条语句中引用多个CTE时,可以定义多个,中间用逗号分隔
with cte_name1 as ( select * from Sys_Log ), cte_name2 as ( select * from Sys_Log ) select * from cte_name1 UNION select * from cte_name2递归公用表表达式(CTE)
对于递归公用表达式来说,实现原理也是相同的,同样需要在语句中定义两部分:
- 基本语句
- 递归语句
在SQL这两部分通过UNION ALL连接结果集进行返回:
比如我现在有一张表 里面存的是树形结构,学院院系>专业>年纪>班级
如何根据班级id查找他的所以父极了?
也可以根据父级编号递归查询它所以的下级编号,
这就是CTE的便利
总结CTE是一种十分优雅的存在。CTE所带来最大的好处是代码可读性的提升,这是良好代码的必须品质之一。使用递归CTE可以更加轻松愉快的用优雅简洁的方式实现复杂的查询。
- [SQL Server 2005/2008]递归更新update(使用CTE公用表达式)
- [SQL Server 2005/2008]删除重复行(使用CTE公用表达式)
- 关于SQL SERVER 公用表达式CTE应用递归时的模型个人的理解
- SQL Server 2005公用表达式实现递归
- sql server 使用公共表表达式(CTE)递归
- Sql学习第三天——SQL 关于CTE(公用表达式)的递归查询使用
- sql server 公共表达式的简单应用(cte)
- Sql Server系列:通用表表达式CTE
- T-SQL查询——详解公用表达式(CTE)
- CTE公用表达式实现递归查询
- Sql学习第三天——SQL 关于CTE(公用表达式)的递归查询使用
- SQL SERVER 2005 CTE(通用表达式)
- SQL Server公用表达式CET递归查询所有上级数据
- SQL技巧(二) - CTE(公用表达式)初步接触
- SQL Server中利用正则表达式替换字符串的方法
- 用SQL Server 2005 CTE简化查询
- SQL Server 【CTE + FOR XML PATH】使用笔记~
- SQL Server 数据库中的递归CTE查询
- SQL优化(五) PostgreSQL (递归)CTE 通用表表达式
- SQL Server通过外部程序集注册正则表达式函数(CLR函数) [转]