WITH AS 使用
WITH AS 含义:
WITH AS短语,也叫做子查询部分(subquery factoring),可以让你做很多事情,定义一个SQL片断,该SQL片断会被整个SQL语句所用到。有的时候,是为了让SQL语句的可读性更高些,也有可能是在UNION ALL的不同部分,作为提供数据的部分。
特别对于UNION ALL比较有用。因为UNION ALL的每个部分可能相同,但是如果每个部分都去执行一遍的话,则成本太高,所以可以使用WITH AS短语,则只要执行一遍即可。如果WITH AS短语所定义的表名被调用两次以上,则优化器会自动将WITH AS短语所获取的数据放入一个TEMP表里,如果只是被调用一次,则不会。而提示materialize则是强制将WITH AS短语里的数据放入一个全局临时表里。很多查询通过这种方法都可以提高速度。(百度文库)
WITH AS 使用:
数据结构及页面显示格式:

简单的嵌套语句:
SELECT CombRulesID ,
CombCode ,
CombName ,
ParentRuleID ,
Child ,
Depth
FROM dbo.AS_CombRules
WHERE CombRulesID IN ( SELECT CombRulesID
FROM dbo.AS_CombRules
WHERE ParentRuleID = 121)
这只是一个简单的子查询,若是嵌套过多会浪费性能,还会给阅读性带来很大的不便,更会给维护性带来麻烦。下面我们写一个表变量的方式实现这段 SQL 做一个比较。
DECLARE @T TABLE ( temp NVARCHAR(3) );
INSERT INTO @T
( temp
)
( SELECT CombRulesID
FROM dbo.AS_CombRules
WHERE ParentRuleID = 121
);
SELECT CombRulesID ,
CombCode ,
CombName ,
ParentRuleID ,
Child ,
Depth
FROM dbo.AS_CombRules
WHERE CombRulesID IN ( SELECT *
FROM @T )
这个SQL看起来比上面的还要复杂,更麻烦。但是却能让SQL更容易维护。唯一遗憾的是,表变量引用了临时表,从而增加了额外的I/O开销,因此,表变量的方式不适合数据量大且频繁操作数据的情况。
那么问题来了,我们用什么方式实现能有好的阅读性、维护性及性能呢?答案是:CET(公用表表达式)。
用CET实现上面的SQL:
WITH org
AS ( SELECT CombRulesID
FROM dbo.AS_CombRules
WHERE ParentRuleID = 121
)
SELECT CombRulesID ,
CombCode ,
CombName ,
ParentRuleID ,
Child ,
Depth
FROM dbo.AS_CombRules
WHERE CombRulesID IN ( SELECT *
FROM org )
看是不是又有可读性,又兼备维护性呢,有没有额外的I/O开销,一举多得啊。
注意:
在使用CTE时要注意如下几个问题:
- CET后面必须直接使用CET的SQL语句(CRUD),否则CET将会失效。
WITH org
AS ( SELECT CombRulesID
FROM dbo.AS_CombRules
WHERE ParentRuleID = 121
)
SELECT CombRulesID ,
CombCode ,
CombName ,
ParentRuleID ,
Child ,
Depth
FROM dbo.AS_CombRules
WHERE ParentRuleID = 0; -- 应将这条SQL直接去掉, 直接跟着后面的那条使用CTE的SQL
SELECT CombRulesID ,
CombCode ,
CombName ,
ParentRuleID ,
Child ,
Depth
FROM dbo.AS_CombRules
WHERE CombRulesID IN ( SELECT *
FROM org );
异常信息:

WITH AS 递归:
WITH ORG ( CombRulesID )
AS ( SELECT CombRulesID
FROM dbo.AS_CombRules
WHERE CombRulesID IN ( SELECT col
FROM Split('', '_') ) --查询出当前附加分项的CombRulesID
UNION ALL --必须包含 UNION ALL 关键字, 显示当前级别以下的所有有关的数据
SELECT CR.CombRulesID
FROM ORG --查询出附加分项的所有节点CombRulesID
INNER JOIN dbo.AS_CombRules CR ON CR.ParentRuleID = ORG.CombRulesID
--递归,查询这个表中CR表中ParentRuleID等于ORG中的所有节点的CombRulesID
WHERE ExamType = 2
)
DELETE dbo.AS_CombRules
WHERE CombRulesID IN ( SELECT CombRulesID
FROM ORG )
随机推荐
- 一步一步学Linq to sql(六):探究特性
			延迟执行 IQueryable query = from c in ctx.Customers select c; 这样的查询句法不会导致语句立即执行,它仅仅是一个描述,对应一个SQL.仅仅在需要使用 ... 
- nginx https ssl 配置
			#设置https 访问server { listen ; server_name www.xxx.com; access_log xxx/xxx/xxx.log combined; index ind ... 
- React开发时候注意点
			JSX 使用jsx的使用,用一个{}包裹起来,例如 const method = {<div> 123 </div>} 使用()小括号,防止分号自动插入 const eleme ... 
- kaldi解码及特征提取详解
			目录 1. 注意事项 2. 流程图: 3. 具体流程指令: 1. 注意事项 首先要训练好模型,用到3个文件,分别是: final.mdl(训练模型得到的模型文件) final.mat(用来特征转换) ... 
- 【iOS开发】NSOperation简单介绍
			iOS开发多线程篇—NSOperation简单介绍 一.NSOperation简介 1.简单说明 NSOperation的作⽤:配合使用NSOperation和NSOperationQueue也能实现 ... 
- 微信公众号开发java框架:wx4j(MaterialUtils篇)
			wx4j-MaterialUtils的使用 函数说明:上传永久视频素材 参数:文件路径.视频描述(通过setter填充内容即可) 返回值:微信服务器返回的json字符串 public static S ... 
- Python + OpenCV 实现LBP特征提取
			背景 看了些许的纹理特征提取的paper,想自己实现其中部分算法,看看特征提取之后的效果是怎样 运行环境 Mac OS Python3.0 Anaconda3(集成了很多包,浏览器界面编程,清爽) 步 ... 
- iOS-tableViewCell创建时添加一些动画
			有时候因为项目的需要,给tableView添加一些动画: cell.layer.transform = CATransform3DMakeScale(); [UIView animateWithDur ... 
- javascript 数组以及对象的深拷贝
			如果 let arr2 = arr1: 那么只是赋值的引用,改变arr2也会相应的改变arr1: 如果 let arr2 = [].concat(arr1): 如果arr1里面不是引用类型,那么ar ... 
- 如何控制DBGrid里面显示的浮点数小数点后的位数?
			现在dbgrid里面显示的位数太多,有10几位,根本没办法看.请问怎么设置能控制小数点后的位数呢?在c语言里面是 %7.2f就可以了,可惜不知道dephi里面怎么做啊谢谢各位指点 方法1: 把那些 ... 
