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时要注意如下几个问题:

  1. 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 )

随机推荐

  1. linux安装软件的几种方式(kali平台)和一些实用的软件(持续更新)

    安装软件前我们先更改镜像源,编辑 /etc/apt/sources.list 文件, 在文件最前面添加以下条目: #中科大更新源 deb https://mirrors.ustc.edu.cn/kal ...

  2. JAVA大作业汇总3

    JAVA大作业3 代码 ``` package thegreatwork; import java.util.; import java.io.; /Board.java 目的:里面有一些关于如何移动 ...

  3. 雷哥带你走进Javascript

    javascript复习笔记--------------------------------------------1.概念2.面向对象思想3.作用认识4.引入方式5.执行顺序 变量 1)声明方式 x ...

  4. PS作业

  5. 网易云terraform实践

    此文已由作者王慎为授权网易云社区发布. 欢迎访问网易云社区,了解更多网易技术产品运营经验. 一.terraform介绍 随着应用上云的常态化,资源栈动态管理的需求对用户也变得更加急切.资源编排(Res ...

  6. 《Cracking the Coding Interview》读书笔记

    <Cracking the Coding Interview>是适合硅谷技术面试的一本面试指南,因为题目分类清晰,风格比较靠谱,所以广受推崇. 以下是我的读书笔记,基本都是每章的课后习题解 ...

  7. C#文件重命名的代码

    C#中没有重命名的方法,自己写了一个方法,来处理文件的重命名. /// <summary> /// 重命名文件夹内的所有子文件夹 /// </summary> /// < ...

  8. 深度学习anchor的理解

    摘抄与某乎 anchor 让网络学习到的是一种推断的能力.网络不会认为它拿到的这一小块 feature map 具有七十二变的能力,能同时从 9 种不同的 anchor 区域得到.拥有 anchor ...

  9. pip消失后复原

    pip是python中比较常用的管理依赖包的工具.今天心血来潮更新一下pip版本,结果悲剧发生了. -bash: /Library/Frameworks/Python.framework/Versio ...

  10. BZOJ 2946 POI2000 公共串 后缀自动机(多串最长公共子串)

    题意概述:给出N个字符串,每个串的长度<=2000(雾...可能是当年的年代太久远机子太差了),问这N个字符串的最长公共子串长度为多少.(N<=5) 抛开数据结构,先想想朴素做法. 设计一 ...