SQLServer 中的WITH AS

本文涉及的产品
云数据库 RDS SQL Server,基础系列 2核4GB
简介: SQLServer 中的WITH AS

with as 的优点

如果WITH AS短语所定义的表名被调用两次以上,则优化器会自动将WITH AS短语所获取的数据放入一个TEMP表里,如果只是被调用一次,则不会。

而提示materialize则是强制将WITH AS短语里的数据放入一个全局临时表里。很多查询通过这种方法都可以提高速度。

例子

with 
cr as 
( 
    select CountryRegionCode from person.CountryRegion where Name like 'C%' 
) 
select * from person.StateProvince where CountryRegionCode in (select * from cr)

其中cr是一个公用表表达式,该表达式在使用上与表变量类似,只是SQL Server 2005在处理公用表表达式的方式上有所不同。

注意

1 . CTE后面必须直接跟使用CTE的SQL语句(如select、insert、update等),否则,CTE将失效。如下面的SQL语句将无法正常使用CTE:

with 
cr as 
( 
    select CountryRegionCode from person.CountryRegion where Name like 'C%' 
) 
select * from person.CountryRegion -- 应将这条SQL语句去掉 
-- 使用CTE的SQL语句应紧跟在相关的CTE后面 -- 
select * from person.StateProvince where CountryRegionCode in (select * from cr)

2 . CTE后面也可以跟其他的CTE,但只能使用一个with,多个CTE中间用逗号(,)分隔,如下面的SQL语句所示:

with 
cte1 as 
( 
    select * from table1 where name like 'abc%' 
), 
cte2 as 
( 
    select * from table2 where id > 20 
), 
cte3 as 
( 
    select * from table3 where price < 100 
) 
select a.* from cte1 a, cte2 b, cte3 c where a.id = b.id and a.id = c.id

3 .如果CTE的表达式名称与某个数据表或视图重名,则紧跟在该CTE后面的SQL语句使用的仍然是CTE,当然,后面的SQL语句使用的就是数据表或视图了,如下面的SQL语句所示:

-- table1是一个实际存在的表 
with 
table1 as 
( 
    select * from persons where age < 30 
) 
select * from table1 -- 使用了名为table1的公共表表达式 
select * from table1 -- 使用了名为table1的数据表

。。。。。。

目录
相关文章
|
SQL 索引
在 SQL Server 中使用 STRING_AGG 函数
【8月更文挑战第5天】
3055 2
在 SQL Server 中使用 STRING_AGG 函数
|
小程序 开发工具 开发者
【已解决】微信小程序编译后白屏(The resource was preloaded using link preload but not used within a few seconds ...)
微信小程序编译后白屏(The resource was preloaded using link preload but not used within a few seconds ...)
2902 0
【已解决】微信小程序编译后白屏(The resource was preloaded using link preload but not used within a few seconds ...)
|
安全 Python Windows
[笔记]逆向工具IDA Pro之简单使用
[笔记]逆向工具IDA Pro之简单使用
2724 0
|
网络安全 Docker 容器
进入正在运行的Docker容器的4种方式
进入正在运行的Docker容器的4种方式
12325 1
|
SQL 存储
如何在 SQL Server 中使用 `OUTPUT` 子句
【8月更文挑战第10天】
407 7
如何在 SQL Server 中使用 `OUTPUT` 子句
|
10月前
|
SQL Oracle 关系型数据库
Oracle 从 DMP 文件中恢复指定表的步骤
Oracle 从 DMP 文件中恢复指定表的步骤
855 7
|
10月前
|
数据库 数据安全/隐私保护 Windows
Windows远程桌面出现CredSSP加密数据修正问题解决方案
【10月更文挑战第30天】本文介绍了两种解决Windows系统凭据分配问题的方法。方案一是通过组策略编辑器(gpedit.msc)启用“加密数据库修正”并将其保护级别设为“易受攻击”。方案二是通过注册表编辑器(regedit)在指定路径下创建或修改名为“AllowEncryptionOracle”的DWORD值,并将其数值设为2。
8723 3
|
存储 安全 数据中心
交换机和集线器有什么区别?
【8月更文挑战第4天】
6936 12
|
SQL 分布式计算 数据处理
【Hive】sort by 和 order by 的区别
【4月更文挑战第15天】【Hive】sort by 和 order by 的区别
|
C#
C#如何实现窗体最小化到托盘
C#如何实现窗体最小化到托盘
342 0