宝哥软件园

SQL SERVER常用表表达式CTE详解

编辑:宝哥软件园 来源:互联网 时间:2021-08-04

类型:数据库类大小:40.7M语言:中文评分:6.6 tab:立即下载

对于SELECT查询语句,为了使T-SQL代码更加简洁易读,查询中其他结果集的引用由视图分解,而不是子查询。但是,视图作为系统对象存在于数据库中,因此当结果集只需要在存储过程或用户定义函数中使用一次时,使用视图有些奢侈。

公共表表达式是在SQL SERVER 2005之后引入的一项功能。CTE可以看作是一个临时结果集,可以在下一个select、insert、update、delete和merge语句中多次引用。使用通用表达式可以使语句更清晰、更简洁。

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

您可以定义递归公共表表达式(ctes)

当结果集不需要作为视图在多个地方引用时,CTE可以使其更加简洁

GROUP BY语句可以直接作用于子查询获得的标量列

一个通用的表表达式(CTE)可以在一个语句中被多次引用

通用表表达式的定义(CTE)

通用表达式的定义非常简单,它只包含三个部分:

通用表表达式的名称(在WITH之后)

涉及的列名(可选)

SELECT语句(紧接在AS之后)

MSDN原型:

用表达式名[(列名[,n])]AS(CTE _查询_定义)

根据是否递归,公共表(CTE)表达式可以分为递归公共表表达式和非递归公共表表达式。

非递归公共表表达式(CTE)

非递归公共表表达式(CTE)意味着查询结果只为外部查询调用返回一个结果集。在它定义的声明中,它没有称自己为CTE

非递归公共表表达式(CTE)的使用方式与视图和子查询相同

例如,简单的非递归公共表表达式:

当然,通用表表达式的好处之一是:可以在下一条语句中被多次引用

我一直强调“在下一句”的意思是只有下一句可以用:

由于CTE只能在下一个语句中使用,当您需要在下一个语句中引用多个cte时,您可以定义多个cte,用逗号分隔:

递归公共表表达式(CTE)

递归公共表表达式非常类似于派生表,派生表是指在CTE的语句中调用自己的CTE。与派生表不同,可以一次为多个派生递归定义CTE。对于递归的概念,函数或过程直接或间接地调用自己。递归的简单概念图如下:

C语言中递归的一个典型例子是斐波那契数列:

长fib(int n) { if (n==0)返回0;if (n==1)返回1;if (n1)返回光纤(n-1)光纤(n-2);}

从上面的C语言代码可以看出,要形成一个递归函数,需要两个部分。第一部分是基础部分,它返回一个固定值,也就是告诉程序什么时候开始递归。第二部分是循环部分,函数或过程直接或间接调用自身进行递归。

对于递归通用表达式,实现原理是一样的,需要在语句中定义两部分:

基本说明

递归语句

在SQL的这两个部分中,通过UNION ALL连接结果集以返回:

比如在AdventureWork中,我想知道每个员工的级别,0是最高级别

这样复杂的查询通过递归CTE变得优雅简洁,这也是CTE最强大的部分。

当然,权力越强,需要受到的约束就越多。如果使用不当,递归CTE可能有无限递归。因此,SQL Server提供了OPTION,可以将最大递归次数设置为:

同样,上面的语句将递归次数限制为:次

提示信息:

这个最大递归次数通常与数据所代表的特定业务相关。比如这里假设公司层面最多只有两个层面。

摘要

CTE是一个非常优雅的存在。CTE带来的最大好处是提高了代码的可读性,这是好代码的必备品质之一。使用递归CTE可以以优雅简洁的方式更轻松愉快地实现复杂查询。

更多资讯
游戏推荐
更多+