SQL- With as 用法
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 用法相关推荐
- 9.mybatis动态SQL标签的用法
mybatis动态SQL标签的用法 动态 SQL MyBatis 的强大特性之一便是它的动态 SQL.如果你有使用 JDBC 或其他类似框架的经验,你就能体会到根据不同条件拼接 SQL 语句有多么痛苦 ...
- PL/SQL 的一些用法
变量的声明,赋值,打印(declare是pl/sql里面的用法 variable是sql*plus里面的用法,variable相当于一个sql*plus环境的全局变量,declare里定义的是pl/s ...
- SQL CASE WHEN用法
SQL CASE WHEN用法 CASE 可能是 SQL 中被误用最多的关键字之一.虽然你可能以前用过这个关键字来创建字段,但是它还具有更多用法.例如,你可以在 WHERE 子句中使用 CASE . ...
- sql not exists用法_SQL Server 2012 高级用法(一)
最近用到了SQL Server 相关数据库等问题,于是整理了如下SQL Server高级用法系列. 该系列不再介绍基础用法(select ,insert, update, delete, and or ...
- PL/SQL之JOB用法 (定时跑数据)
转载自 PL/SQL之JOB用法 (定时跑数据) 一.DBMS_Job包的用法 包含以下子过程: Broken()过程. change()过程. Interv ...
- COLLATE oracle,Sql 中Collate用法
今天查询sqlite的时候需要不区分大小写,查了下文档,需要使用collate nocase.顺便学习下collate的用法. collate在sql中是用来定义排序规则的.排序规则其实就是当比较两个 ...
- sql replace函数用法_esProc 的 SQL 应用方案
esProc 的 SQL 功能支持文件计算.性能优化等独特功能,本文将总结桌面 IDE.命令行等不同环境下 SQL 的用法,以及常用文件格式.特殊分隔符等多种应用方案,详情点击esProc 的 SQL ...
- oracle数据库中sql%notfound的用法
SQL%NOTFOUND 是一个布尔值.与最近的sql语句(update,insert,delete,select)发生交互,当最近的一条sql语句没有涉及任何行的时候,则返回true.否则返回fal ...
- gispython定义查询_Python与开源GIS:SpatiaLite 中的基本SQL数据库查询用法
Python与开源GIS教程的内容,开发了单独的内容,请打开 https://www.osgeo.cn/pygis/ 查看. 本页面的内容不再更新. 这一节我们来看一下基本的SQL语句用法.使用最通用 ...
- sql中变量用法_SQL变量:基础和用法
sql中变量用法 In this article, we will learn the notions and usage details of the SQL variable. In SQL Se ...
最新文章
- Springboot搭建web项目
- python namedtuple (命名元组)用法详解
- 大厂经验(二):多端可视化埋点解决方案
- linux 64 32 编译支持,在64位linux上编译32位程序 for i386 intel
- linux下三三维建模软件,SolidWorks是基于()原创的三维实体建模软件。A.UNIXB.WindowsC.LinuxD.Dos...
- Flex tree加三状态的Checkbox
- 怎样从 Ubuntu 12.10 升级到 Ubuntu 13.04
- C++中rapidxml用法及例子
- 每日一问 --信源编码的过程?
- webstack开源网站导航源码
- Android系统换字体不root,安卓手机更换字体简易方法(免ROOT)
- 读书 | 少有人走的路心智成熟的旅程读后感
- 作为程序员,每天交清晰的工作日报,不允许含糊和不详细,大家怎么看?
- 细数网易云音乐上那些适合开车时听的歌单。
- 一元函数积分学2_不定积分的分部积分法
- 微信企业号和企业微信消息发送区别
- python开发的炸金花小游戏来啦,从此不再无聊~
- mathtype 章节号 Equation Chapter 1 Section 1 的去除
- Android图片打水印
- 2021蓝桥杯B组C/C++解析