SQL With As用法一.WITH AS的含义用AS语言,也叫做子查询部分(subquery factoring),可以定义一个SQL片断,该SQL片断会被整个SQL语句用到。可以使用SQL语句的可读性更高,也可以在UNION ALL的不同部分,作为提供数据的部分。对于UNION ALL,使用与AS定义了一个UNION ALL语句,当该片断被调用2次以上,优化器会自动将该WITH AS短语所获取的数据放入一个Temp表中。而提示meterialize则是强制将WITH AS短语的数据放入一个全局临时表中。很多查询通过该方式都可以提高速度。二。使用方法先看下面一个嵌套的查询语句:SELECT * FROM person.StateProvince其中CountryRegionCode在(从person.CountryRegion选择CountryRegionCode,其中名称如 'C%')上面的查询语句使用了一个子查询虽然这条SQL语句并不复杂,但如果嵌套的层次过多,会使用SQL语句非常难以阅读和维护。因此,也可以使用表变量的 来解决这个问题,SQL语句如下:声明@t表(CountryRegionCode nvarchar的的(3))插入@t(CountryRegionCode)(从person.CountryRegion中选择CountryRegionCode,其中名称为 'C%')

select * from person.StateProvince其中CountryRegionCode in(select * from @t)虽然上面的SQL语句要比第一种方式更复杂,但却将子查询放在了表变量@t中,这样做将使SQL语句更容易维护,但又会带来另一个问题,就是性能的损失。由于表变量实际上使用了临时表,从而增加了额外的I / O开销,因此,表变量的方式并不太适合数据量大而频繁查询的情况。为此,在SQL Server 2005中提供了另外一种解决方案,这就是公用表表达式(CTE),使用CTE,可以使用SQL语句的可维护性,同时,CTE要比表面量的效率高得多。下面是CTE的语法:[WITH <common _ table _ expression> [,n]] <common _ table _ expression> :: = expression _ name [(column _ name [,n] )] AS(CTE _ query _ definition)现在使用CTE来解决上面的问题,SQL语句如下:

复制代码用Cr作为(从person.CountryRegion选择CountryRegionCode,其中名称就像 'C%')SELECT * FROM person.StateProvince其中CountryRegionCode在(SELECT * FROM CR)复制代码其中CR是一个公用表表达式,该表达在使用上与表变量类似,只是SQL Server 2005中在处理公用表表式的方式上有所不同。在使用CTE时应注意如下几点:1.CTE后面必须直接跟使用CTE的SQL语句(如选择,插入,更新等),否则,CTE将失效如下面的SQL语句将无法正常使用CTE:复制代码与Cr作为(从person.CountryRegion选择CountryRegionCode,其中名称如 'C%')SELECT * FROM person.CountryRegion - - 应用这条SQL语句去掉 - 使用CTE的SQL语句应紧跟在相关的CTE后面 - SELECT * FROM person.StateProvince其中CountryRegionCode在(SELECT * FROM CR)复制代码2.CTE后面也可以跟其他的CTE,但只能使用一个,多个CTE中间用逗号(,)分隔,如下面的SQL语句所示:复制代码与cte1 as(select * from table1 where name like'abc%'),cte2 as(

select * from table2,其中id> 20),cte3 as(select * from table3,其中price <100)from cte1 a,cte2 b,cte3 c中选择a。*,其中a.id = b.id和a。 id = c.ID复制代码3.如果CTE的表达式名称与某个数据表或视图重名,则紧跟在该CTE后面的SQL语句使用的仍然是热膨胀系数,当然,后面的SQL语句使用的就是数据表或视图了,如下面的SQL语句所示:复制代码 -  table1是一个实际存在的表,其中table1为(选择*来自年龄<30的人)select * from table1  - 使用了名为table1的公共表表达式select * from table1  - 使用了名为table1的数据表复制代码4.CTE可以引用自身,也可以引用在同一与子句中预先定义的CTE。不允许前向引用。复制代码 - 使用使用DirectReports(ManagerID,EmployeeID,EmployeeLevel)AS (    SELECT ManagerID,EmployeeID,0 AS EmployeeLevel     FROM HumanResources.Employee     WHERE ManagerID IS NULL )递归公用表表达式显示递归的多个级别     UNION ALL     SELECT e.ManagerID,e.EmployeeID,EmployeeLevel + 1FROM HumanResources.Employee e         INNER JOIN DirectReports d         ON e.ManagerID = d.EmployeeID )SELECT ManagerID ,EmployeeID,EmployeeLevel FROM DirectReports; - 使用递送公用表表达式显示递归的两个级别WITH DirectReports(ManagerID,EmployeeID,EmployeeLevel)AS (    SELECT ManagerID,EmployeeID,0 AS EmployeeLevel     FROM HumanResources.Employee     WHERE ManagerID IS NULL     UNION ALL     SELECT e.ManagerID,e。 EmployeeID,EmployeeLevel + 1     FROM HumanResources.Employee e         INNER JOIN DirectReports d         ON e.ManagerID = d.EmployeeID )SELECT ManagerID ,EmployeeID,EmployeeLevel

FROM DirectReports
WHERE EmployeeLevel <= 2

- 使用递归公用表表达式显示
层次列表与DirectReports(名称,标题,EmployeeID,EmployeeLevel,排序)
AS(SELECT CONVERT(varchar(255),c.FirstName +''+ c.LastName),
e.Title,
e .EmployeeID,
1,
CONVERT(varchar(255),c.FirstName +''+ c.LastName)
FROM HumanResources.Employee AS e
JOIN Person.Contact AS c ON e.ContactID = c.ContactID
WHERE e.ManagerID IS NULL
UNION ALL
SELECT CONVERT(varchar(255),REPLICATE('|',EmployeeLevel)+
c.FirstName +''+ c.LastName),
e.Title,
e.EmployeeID,
EmployeeLevel + 1,
CONVERT(varchar(255),RTRIM(Sort)+'|'+ FirstName +''+
LastName)
FROM HumanResources.Employee as e
JOIN Person.Contact AS c ON e.ContactID = c.ContactID
JOIN DirectReports AS d ON e。 ManagerID = d.EmployeeID

SELECT EmployeeID,Name,Title,EmployeeLevel
FROM DirectReports
ORDER BY Sort

- 使用MAXRECURSION取消一条语句
- 可以使用MAXRECURSION来防止不合理的递归CTE进入无限循环。以下示例特意创建了一个无限循环,然后使用MAXRECURSION提示将递归级别限制为两级
WITH cte (EmployeeID,ManagerID,Title)如

SELECT雇员,经理ID,标题
FROM HumanResources.Employee
WHERE经理ID IS NOT NULL
UNION ALL
SELECT cte.EmployeeID,cte.ManagerID,cte.Title
FROM CTE
JOIN HumanResources.Employee为e
ON cte.ManagerID = e.EmployeeID

-Uses MAXRECURSION将递归级别限制为2
SELECT EmployeeID,ManagerID,Title
FROM
cte OPTION(MAXRECURSION 2)
- 在更正代码错误之后,就不再需要MAXRECURSION。以下示例显示了更正后的代码
WITH cte(EmployeeID,ManagerID,Title)
AS

SELECT EmployeeID,ManagerID,Title
FROM HumanResources.Employee
WHERE ManagerID IS NOT NULL
UNION ALL
SELECT e.EmployeeID,e.ManagerID,e.Title
FROM HumanResources.Employee AS e
JOIN cte ON e .ManagerID = cte.EmployeeID
)SELECT EmployeeID,ManagerID,Title FROM cte复制代码5.不能在CTE _ query _ definition中使用以下子句:(1)COMPUTE或COMPUTE BY(2)ORDER BY(除非指定了TOP子句)(3)INTO (4)带有查询提示的OPTION子句(5)for XML(6)for BROWSE 6.如果将CTE用于属于批处理的一部分的语句中,那么在它之前的语句必须以分号结尾,如下面的SQL所示:复制代码声明@s nvarchar(3)设置@s ='C%'; - 必须加分号与t _ tree为(从person.CountryRegion选择CountryRegionCode其中类似@s名称)SELECT * FROM person.StateProvince其中CountryRegionCode中(选择t _ tree *)复制代码

SQL- With as 用法相关推荐

  1. 9.mybatis动态SQL标签的用法

    mybatis动态SQL标签的用法 动态 SQL MyBatis 的强大特性之一便是它的动态 SQL.如果你有使用 JDBC 或其他类似框架的经验,你就能体会到根据不同条件拼接 SQL 语句有多么痛苦 ...

  2. PL/SQL 的一些用法

    变量的声明,赋值,打印(declare是pl/sql里面的用法 variable是sql*plus里面的用法,variable相当于一个sql*plus环境的全局变量,declare里定义的是pl/s ...

  3. SQL CASE WHEN用法

    SQL CASE WHEN用法 CASE 可能是 SQL 中被误用最多的关键字之一.虽然你可能以前用过这个关键字来创建字段,但是它还具有更多用法.例如,你可以在 WHERE 子句中使用 CASE . ...

  4. sql not exists用法_SQL Server 2012 高级用法(一)

    最近用到了SQL Server 相关数据库等问题,于是整理了如下SQL Server高级用法系列. 该系列不再介绍基础用法(select ,insert, update, delete, and or ...

  5. PL/SQL之JOB用法 (定时跑数据)

    转载自   PL/SQL之JOB用法 (定时跑数据) 一.DBMS_Job包的用法   包含以下子过程:        Broken()过程.      change()过程.      Interv ...

  6. COLLATE oracle,Sql 中Collate用法

    今天查询sqlite的时候需要不区分大小写,查了下文档,需要使用collate nocase.顺便学习下collate的用法. collate在sql中是用来定义排序规则的.排序规则其实就是当比较两个 ...

  7. sql replace函数用法_esProc 的 SQL 应用方案

    esProc 的 SQL 功能支持文件计算.性能优化等独特功能,本文将总结桌面 IDE.命令行等不同环境下 SQL 的用法,以及常用文件格式.特殊分隔符等多种应用方案,详情点击esProc 的 SQL ...

  8. oracle数据库中sql%notfound的用法

    SQL%NOTFOUND 是一个布尔值.与最近的sql语句(update,insert,delete,select)发生交互,当最近的一条sql语句没有涉及任何行的时候,则返回true.否则返回fal ...

  9. gispython定义查询_Python与开源GIS:SpatiaLite 中的基本SQL数据库查询用法

    Python与开源GIS教程的内容,开发了单独的内容,请打开 https://www.osgeo.cn/pygis/ 查看. 本页面的内容不再更新. 这一节我们来看一下基本的SQL语句用法.使用最通用 ...

  10. sql中变量用法_SQL变量:基础和用法

    sql中变量用法 In this article, we will learn the notions and usage details of the SQL variable. In SQL Se ...

最新文章

  1. Springboot搭建web项目
  2. python namedtuple (命名元组)用法详解
  3. 大厂经验(二):多端可视化埋点解决方案
  4. linux 64 32 编译支持,在64位linux上编译32位程序 for i386 intel
  5. linux下三三维建模软件,SolidWorks是基于()原创的三维实体建模软件。A.UNIXB.WindowsC.LinuxD.Dos...
  6. Flex tree加三状态的Checkbox
  7. 怎样从 Ubuntu 12.10 升级到 Ubuntu 13.04
  8. C++中rapidxml用法及例子
  9. 每日一问 --信源编码的过程?
  10. webstack开源网站导航源码
  11. Android系统换字体不root,安卓手机更换字体简易方法(免ROOT)
  12. 读书 | 少有人走的路心智成熟的旅程读后感
  13. 作为程序员,每天交清晰的工作日报,不允许含糊和不详细,大家怎么看?
  14. 细数网易云音乐上那些适合开车时听的歌单。
  15. 一元函数积分学2_不定积分的分部积分法
  16. 微信企业号和企业微信消息发送区别
  17. python开发的炸金花小游戏来啦,从此不再无聊~
  18. mathtype 章节号 Equation Chapter 1 Section 1 的去除
  19. Android图片打水印
  20. 2021蓝桥杯B组C/C++解析

热门文章

  1. adb devices offline 怎么处理
  2. 未转变者怎么调服务器难度,未转变者服务器怎么设置出生点 | 手游网游页游攻略大全...
  3. 什么是海外DDoS高防?
  4. 【办公-WORD】Word 背景颜色层次分析
  5. 【rzxt】笔者支招:电脑的散热大户显卡温度过高如何解决
  6. [WSL]Ubuntu指定的网络名不可再用
  7. 数学专业偏向算法智力题的面试题
  8. NAT类型与P2P游戏
  9. 08年度的佳作——《真・恋姫†無双》玩后感(蜀国篇)+AGTH真正提取大法
  10. JDK官方下载(旧版本,以前老版本)