广告
返回顶部
首页 > 资讯 > 精选 >SQL Server怎么使用T-SQL公用表表达式
  • 781
分享到

SQL Server怎么使用T-SQL公用表表达式

2023-06-30 16:06:53 781人浏览 独家记忆
摘要

本文小编为大家详细介绍“sql Server怎么使用T-SQL公用表表达式”,内容详细,步骤清晰,细节处理妥当,希望这篇“SQL Server怎么使用T-SQL公用表表达式”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢

本文小编为大家详细介绍“sql Server怎么使用T-SQL公用表表达式”,内容详细,步骤清晰,细节处理妥当,希望这篇“SQL Server怎么使用T-SQL公用表表达式”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。

在编写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_TestAS(    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.Idorder by a.Id desc;

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

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

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

输出结果如下:

SQL Server怎么使用T-SQL公用表表达式

由于CTE只能在接下来一条语句中使用,因此,当需要接下来的一条语句中引用多个CTE时,可以定义多个,中间用逗号分隔。下面是一次定义多个CTE的例子:

with CTE_Test1  as (select * from Person_1),      CTE_Test2  as (select * from Person_2)select * from CTE_Test1uNIOnselect * from CTE_Test2;

结果如下:

SQL Server怎么使用T-SQL公用表表达式

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

对于递归公用表达式来说,只需要在语句中定义两部分:

  • 基本语句

  • 递归语句

先建一张表栏目表如下,栏目Id,栏目名称,栏目的父栏目。

SQL Server怎么使用T-SQL公用表表达式

现在使用CTE查询其每个栏目是第几层栏目的代码如下:

declare @table1 table(id int, Name varchar(10), ParentId int);insert into @table1(id, Name, ParentId)values(1, '国内新闻', 0),    (2, '广东新闻', 1),    (3, '广州新闻', 2),    (4, '天河新闻', 3),    (5, '山东新闻', 1),    (5, '青岛新闻', 5);select * from @table1;with COL_CTE(Id, Name, ParentId, tLevel) as (    --基本语句    select id, Name, ParentId, 0 as tLevel from @table1 where ParentId=0    union all    --递归语句    select c.id, c.Name, c.ParentId, ce.tLevel+1 as tLevel from @table1 as c    inner join COL_CTE as ce --递归调用    on c.ParentId=ce.Id)select * from COL_CTE;

输出结果如下:

SQL Server怎么使用T-SQL公用表表达式

0表示顶级栏目。1就是1级栏目。语法非常优雅。就一个SELECT * FRON COL_CTE。这正是CTE强大的地方,但是,这要有约束,否则如果无限制递归可以会消耗掉非常多的系统资源。下面来看看如何限制递归的最大次数。

如将上面的查询语法改为:

WITH COL_CTE(Id,Name,ParentId,tLevel )AS(    --基本语句    SELECT Id,Name,ParentId,0 AS tLevel FROM @table1 WHERE ParentId = 0    UNION ALL    --递归语句    SELECT c.Id,c.Name,c.ParentId,ce.tLevel+1 AS tLevel FROM @table1 as c     INNER JOIN COL_CTE AS ce     ON c.ParentId = ce.Id)SELECT * FROM COL_CTEOPTION(MAXRECURSION 2)  --指定最大递归次数为2

我们知道在上面的查询中,要查到天河区新闻最少要递归3次,但是现在只递归2次,运行是什么结果呢?

SQL Server怎么使用T-SQL公用表表达式

提示信息如下:

消息 530,级别 16,状态 1,第 1 行  语句被终止。完成执行语句前已用完最大递归 2。

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

读到这里,这篇“SQL Server怎么使用T-SQL公用表表达式”文章已经介绍完毕,想要掌握这篇文章的知识点还需要大家自己动手实践使用过才能领会,如果想了解更多相关内容的文章,欢迎关注编程网精选频道。

--结束END--

本文标题: SQL Server怎么使用T-SQL公用表表达式

本文链接: https://www.lsjlt.com/news/329893.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • SQL Server怎么使用T-SQL公用表表达式
    本文小编为大家详细介绍“SQL Server怎么使用T-SQL公用表表达式”,内容详细,步骤清晰,细节处理妥当,希望这篇“SQL Server怎么使用T-SQL公用表表达式”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢...
    99+
    2023-06-30
  • SQL Server使用T-SQL进阶之公用表表达式(CTE)
    在编写T-SQL代码时,往往需要临时存储某些结果集。前面我们已经广泛使用和介绍了两种临时存储结果集的方法:临时表和表变量。除此之外,还可以使用公用表表达式的方法。 公用表表达式(Co...
    99+
    2022-11-13
  • sql server 中如何使用公共表达式
    sql server 中如何使用公共表达式,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。一、前言    现在做项目数据访问基本...
    99+
    2022-10-18
  • SQL Server中怎么利用公用表表达式实现递归
    这篇文章给大家介绍SQL Server中怎么利用公用表表达式实现递归,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。公用表表达式简介:公用表表达式 (CTE) 可以认为是在单个 SELE...
    99+
    2022-10-18
  • T-SQL中如何使用正则表达式函数
    今天就跟大家聊聊有关T-SQL中如何使用正则表达式函数,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。首先,我们在VSTS中创建一Database P...
    99+
    2022-10-18
  • MyBatis动态SQL表达式怎么使用
    本篇内容介绍了“MyBatis动态SQL表达式怎么使用”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!动态 sql 简单来讲就是我们能通过条件...
    99+
    2023-07-04
  • SQL Server怎么使用T-SQL语句批处理
    本篇内容介绍了“SQL Server怎么使用T-SQL语句批处理”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!批处理简介批处理是作...
    99+
    2023-06-30
  • SQL server 数据库的表的创建与使用T-SQL语句操控数据表
    表的创建与T-SQL语句的使用 一,表的创建与基本概念 表是包含数据库中所有数据的数据库对象,表定义是一个集合。数据在表中组织...
    99+
    2022-10-18
  • SQL Server在T-SQL语句中怎么使用变量
    这篇文章主要介绍了SQL Server在T-SQL语句中怎么使用变量的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇SQL Server在T-SQL语句中怎么使用变量文章都会有所收获,下面我们...
    99+
    2023-06-30
  • SQL 中 CASE 表达式的使用方式
    目录1. 前言2. 语法3. 注意点4. 分类汇总数据5. 一条SQL实现不同条件的统计6. 使用CHECK约束定义多个列的条件关系7. 在UPDATE语句中进行条件分支8. 生成交叉表9. CASE表达式中使用...
    99+
    2022-09-19
  • SQL中CASE表达式的使用方式
    目录1. 前言2. 语法3. 注意点4. 分类汇总数据5. 一条SQL实现不同条件的统计6. 使用CHECK约束定义多个列的条件关系7. 在UPDATE语句中进行条件分支8....
    99+
    2022-11-13
  • 使用T-SQL实现多表查询
    表连接的类型:1.内连接(inner join):是最常用的一种连接方式,只返回两个数据集合之间匹配关系的行,将位于两个互相交叉的数据集合中重叠部分以内的数据行连接起来。 例子:在表A和表B中使用...
    99+
    2022-10-18
  • Mybatis怎么使用ognl表达式实现动态sql
    这篇文章主要为大家展示了“Mybatis怎么使用ognl表达式实现动态sql”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“Mybatis怎么使用ognl表达式实现动态sql”这篇文章吧。新建Us...
    99+
    2023-06-15
  • SQL CHECK约束表达式怎么写
    SQL CHECK约束用于限制列中的值必须满足指定的条件。CHECK约束可以在创建表时定义,也可以在修改表时添加。CHECK约束的语...
    99+
    2023-10-12
    SQL
  • SQL server 中怎样使用临时表
    本篇文章给大家分享的是有关SQL server 中怎样使用临时表,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。举例说明一下比较清晰些,先来看下...
    99+
    2022-10-18
  • SQL正则表达式及mybatis中使用正则表达式的方法
    小编给大家分享一下SQL正则表达式及mybatis中使用正则表达式的方法,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!mysql...
    99+
    2022-10-18
  • sql server数据库性能优化之2-避免使用CTE公用表达式的递归【by zhang502219048】
    数据库优化中的一个实例,记录一下: 1. 原来用了CTE公用表达式的递归,reads高达约40万,看查询执行计划,使用了Nested Loops; 2. 优化去掉递归,改用其它方式实现,reads降低到2639,看查询执行计划,避免了使用...
    99+
    2017-05-24
    sql server数据库性能优化之2-避免使用CTE公用表达式的递归【by zhang502219048】
  • SQL Server中使用表变量和临时表
    一、表变量 表变量在SQL Server 2000中首次被引入。 表变量的具体定义包括列定义,列名,数据类型和约束。而在表变量中可以使用的约束包括主键约束,唯一约束,NULL约束和C...
    99+
    2022-11-13
  • SQL Server系统表有什么用
    本篇文章给大家分享的是有关SQL Server系统表有什么用,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。SQL Server 中各个系统表的...
    99+
    2022-10-18
  • 如何理解CASE表达式作用及使用SQLServerCASE 表达式代替动态SQL
    本篇文章为大家展示了如何理解CASE表达式作用及使用SQLServerCASE 表达式代替动态SQL,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。  SQLServ...
    99+
    2022-10-19
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作