博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Sql Server 公用表达式(CTE)
阅读量:6911 次
发布时间:2019-06-27

本文共 1439 字,大约阅读时间需要 4 分钟。

简介      

           对于select查询语句来说,通常情况下,为了使T-SQL代码更加简洁和可续,在一个查询中引入另外的结果集都是通过视图而不是子查询来进行分解的,但是,视图是作为系统对象存在数据库中,那对于结果集仅仅需要在存储过程或是用户自定义函数中使用一次的时候,使用视图就显得有些奢侈了。

     公用表表达式(Common Table Expression)是SQL SERVER 2005版本之后引入的一个特性.CTE可以看作是一个临时的结果集,可以在接下来的一SELECT,INSERT,UPDATE,DELETE,MERGE语句中被多次引用。使用公用表达式可以让语句更加清晰简练.

     公用表表达式其实提供的功能和视图差不多,但是它不像视图一样把sql语句保存在我们的数据库里面。虽然CTE不是必需的,但是它可以为提高sql的可读性

     微软官方给的使用CET的优势:

  • 编写一个递归查询(类似树查询)
  • 使用要使用一个类似视图的功能,但是又不想把这个查询sql语句的定义保存在数据库
  • 要引用一个返回数据sql语句多次,只需要定义一次。
公用表表达式(CTE)的定义

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

  1.   公用表表达式的名字(在WITH之后)
  2.   所涉及的列名(可选)
  3.   一个SELECT语句(紧跟AS之后)
  WITH expression_name [(column_name [,...n] )]  AS  (     cte_query_definition   )
 
按照是否递归,可以将公用表(CTE)表达式分为递归公用表表达式和非递归公用表表达式.
非递归公用表表达式(CTE)

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

   非递归公用表表达式(CTE)的使用方式和以及一致

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

 
公用表表达式的好处之一是可以在接下来一条语句中多次引用:
 
with cte_nameas(  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_name1as(  select * from Sys_Log),cte_name2as(  select * from Sys_Log)select * from cte_name1UNIONselect * from cte_name2

递归公用表表达式(CTE)

对于递归公用表达式来说,实现原理也是相同的,同样需要在语句中定义两部分:

  •    基本语句
  •    递归语句

在SQL这两部分通过UNION ALL连接结果集进行返回:

比如我现在有一张表 里面存的是树形结构,学院院系>专业>年纪>班级

如何根据班级id查找他的所以父极了?

也可以根据父级编号递归查询它所以的下级编号,

这就是CTE的便利

总结

    CTE是一种十分优雅的存在。CTE所带来最大的好处是代码可读性的提升,这是良好代码的必须品质之一。使用递归CTE可以更加轻松愉快的用优雅简洁的方式实现复杂的查询。

转载于:https://www.cnblogs.com/studydp/p/9026847.html

你可能感兴趣的文章
运动补偿与运动估计
查看>>
jQuery的一个关键函数
查看>>
表单模型+安装目录+侵入表单模型
查看>>
系统如何端子app弄root才干
查看>>
HTML表格边框的设置小技巧
查看>>
jmeter ---模拟http请求/发送gzip数据
查看>>
POJ 2029--Get Many Persimmon Trees +DP
查看>>
Java——复选框:JCheckBox
查看>>
Effective OC : 1-5
查看>>
mock.js 使用教程
查看>>
查看mysql存储引擎
查看>>
Python网络资源 + Python Manual
查看>>
面试中经常会被问到的70个问题
查看>>
在VMware上面安装Solaris 10
查看>>
throw跟throws关键字
查看>>
Linq-批量删除方法
查看>>
关于微信网页调用js-sdk相关接口注意事项目(一级域名与二级域名互相干扰!!!)...
查看>>
第二十三节,不同数据类型在内存中的存址方式,及深浅拷贝
查看>>
PID入门的十五个基本概念
查看>>
用android模拟器Genymotion定位元素
查看>>