SQLServer使用T-SQL进阶之公用表表达式(CTE)


本文整理自网络,侵删。

在编写T-SQL代码时,往往需要临时存储某些结果集。前面我们已经广泛使用和介绍了两种临时存储结果集的方法:临时表和表变量。除此之外,还可以使用公用表表达式的方法。

公用表表达式(Common Table Expression)是SQL Server2005版本的引入的一个特性。CTE可以看组是一个临时的结果集,可以再接下来来的一个SELECT,INSERT,UPDATE,DELETE,MERGE语句中多次引用。

一、3种方法比较

使用公用表达式CTE可以让语句更加清晰简练。与公用表达式作用类似的还有临时表和表变量。下面给出三种方法的对比。

  • 临时表#:需要在临时数据库TempDB中通过I/O操作来创建表结构,一旦用户退出SQL Server环境则自动被删除。
  • 表变量@:在内存中以表结构的形式存在,其定义与变量一致,其使用与表类似,不需要产生I/O。
  • 公用表表达式with as:定义在内存中保存的临时存储结果集对象,不产生I/O,不需要按照表变量这样定义,使用方法和表类似。可以自己引用,也可以再查询中被多次引用。

1、使用CTE好处

根据微软对CTE好处的描述,可以归结为四点:

  • 可以定义递归公用表表达式(CTE)
  • 当不需要将结果集作为视图被多个地方引用时,CTE可以使其更加简洁
  • GROUP BY 语句可以直接作用于子查询所得的标量列
  • 可以在一个语句中多次引用公用表表达式(CTE)

二、WITH AS的含义

WITH AS-做子查询部分(subquery factoring)。

它用于定义一个SQL片段,该片段会被是整个SQL语句所用到。如果WITH AS所以定的表名被调用两次以上,则优化器会自动将WITH AS所获取的数据放入临时表里,如果只是被调用一次,则不会。

可以通过materialize将WITH AS短语里的数据强制放入全局临时表里。

WITH AS可以被紧跟着的一条SQL语句所使用多次,但不能被紧跟着的多条SQL语句使用。

WITH B AS 
(
    SELECT * FROM xxx WHERE Id > 5
)
SELECT * FROM B

三、CTE的定义

CTE的定义语法如下,主要包括3个部分。

  • Expression_name:CTE表达式的名称。
  • Column_name:列名列表。
  • CTE_query_definition:定义CTE结果集的Select查询语句
WITH expression_name [(column_name [,...n] )]
AS
( 
  cte_query_definition 
)

按照是否递归,可以将公用表(CTE)表达式分为递归公用表表达式和非递归公用表表达式.

1、非递归公用表表达式(CTE):

非递归公用表表达式(CTE)是查询结果仅仅一次性返回一个结果集用于外部查询调用。并不在其定义的语句中调用其自身的CTE。

非递归公用表表达式(CTE)的使用方式和视图以及子查询一致。

比如一个简单的非递归公用表表达式:

WITH CTE_Test
AS
(
    SELECT * FROM Person_1
)
SELECT * FROM CTE_Test

公用表表达式的好处之一是可以在接下来一条语句中多次引用:

with CTE_Test 
 as (select * from Person_1)
select * from CTE_Test as a --第一次引用
     inner join CTE_Test as b --第二次引用
         on a.Id=b.Id
order by a.Id desc;

虽然以上引用了多次,但是只是一条语句,所以可以正常执行。

如果多条语句引用,如下面这样,是会报错的。

with CTE_Test as (select * from Person_1)
select * from CTE_Test;
select * from CTE_Test;

输出结果如下:

阅读剩余部分

相关阅读 >>

一文带你理解慢sql分析与优化

sql server中数据行批量插入脚本的存储实现

shardingsphere解析sql示例详解

大数据时代的数据库选择:sql还是nosql

sparksql配置及使用教程

navicat怎么运行sql语句

sql连接服务器失败怎么办

mysql的select 学习笔记

mysql笔记 —sql运算符

表示修改一个数据库对象的sql关键字是什么

更多相关阅读请进入《sql》频道 >>


数据库系统概念 第6版
书籍

数据库系统概念 第6版

机械工业出版社

本书主要讲述了数据模型、基于对象的数据库和XML、数据存储和查询、事务管理、体系结构等方面的内容。



打赏

取消

感谢您的支持,我会继续努力的!

扫码支持
扫码打赏,您说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦

分享从这里开始,精彩与您同在

评论

管理员已关闭评论功能...