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 )
随机推荐
- 【財務会計】BS科目とは・PL科目とは
「BS科目」「PL科目」という言葉がありますが.聞いたことあるけどよくわからん!っていう人は多いと思います.なので.簡単にご説明を. BS科目は「いくらあるか」 「BS科目」は.「B/S科目」と書くこ ...
- IDEA常用操作(一)
1.视图的调整 左下右的侧边栏如何关闭?——右击选择remove from sidebar 面板上(左下右)的导航栏视图如何隐藏——可以在左下角悬停显示,单击隐藏/开启侧边栏 想打开其它视图怎么办?— ...
- Unity 对象的批处理
本文章由cartzhang编写,转载请注明出处. 所有权利保留. 文章链接:http://blog.csdn.net/cartzhang/article/details/52813834 作者:car ...
- [bzoj5158][Tjoi2014]Alice and Bob
好羞愧啊最近一直在刷水... 题意:给定序列$c$的$a_i$,构造出一个序列$c$使得$\sum b_i$最大. 其中$a_i$表示以$c_i$结尾的最长上升子序列长度,$b_i$表示以$c_i$为 ...
- 一步一步学Linq to sql(五):存储过程
普通存储过程 首先在查询分析器运行下面的代码来创建一个存储过程: create proc sp_singleresultset as set nocount on select * from cust ...
- PS作业
- XenServer设置master,摧毁故障主机
XenServer pool 移除server 设置master 这分为Pool Master是正常还是异常2种情况: 正常情况下可能要对Pool Master做一些停机维护,比如换内存条啥的,此时在 ...
- [转载]压力测试工具siege的用法
压力测试工具siege 原文:http://blog.csdn.net/qingye2008/article/details/34500949 Siege是Linux下的一个web系统的压力测试工具, ...
- Git的使用和部署
Git是什么? Git是目前世界上最先进的分布式版本控制系统(没有之一). 什么是版本控制系统? 没有版本控制系统 有了版本控制系统 版本 文件名 用户 说明 日期 1 service.doc 张三 ...
- UVA 437 The Tower of Babylon(DAG上的动态规划)
题目大意是根据所给的有无限多个的n种立方体,求其所堆砌成的塔最大高度. 方法1,建图求解,可以把问题转化成求DAG上的最长路问题 #include <cstdio> #include &l ...