分享一下我老师大神的人工智能教程!零基础,通俗易懂!http://blog.csdn.net/jiangjunshow

也欢迎大家转载本篇文章。分享知识,造福人民,实现我们中华民族伟大复兴!

原文传送门:http://www.itpub.net/thread-1235717-1-3.html

“子查询定义”从句总结(WITH AS 语句)

“子查询定义”从句总结(WITH AS 语句)

一、先看下oracle 10g SQL参考文档(Ora 10G SQL Reference)中的描述(以下汉译部分,仅是个人理解,仅供参考):
1“子查询定义”从句 定义格式:
WITH query_name AS (subquery)[, query_name AS (subquery) ]...2subquery_factoring_clause (“子查询定义”从句部分)

The WITH query_name clause lets you assign a name to a subquery block. You can then reference the subquery block multiple places in the query by specifying the query name. Oracle Database optimizes the query by treating the query name as either an inline view or as a temporary table.

(使用WITH AS 语句可以为一个子查询语句块定义一个名称,使用这个子查询名称可以在查询语句的很多地方引用这个子查询。Oracle数据库像对待内联视图或临时表一样对待被引用的子查询名称,从而起到一定的优化作用。)

You can specify this clause in any top-level SELECT statement and in most types of subqueries. The query name is visible to the main query and to all subsequent subqueries except the subquery that defines the query name itself.

(你可以在任何一个顶层的SELECT语句以及几乎所有类型的子查询语句前,使用子查询定义子句。被定义的子查询名称可以在主查询语句以及所有的子查询语句中引用,但未定义前不能引用 )

3Restrictions on Subquery Factoring (“子查询定义”从句的限制性)

·         You cannot nest this clause. That is, you cannot specify the subquery_factoring_clause within the subquery of another subquery_factoring_clause. However, a query_name defined in one subquery_factoring_clause can be used in the subquery of any subsequent subquery_factoring_clause.

(不能嵌套定义,但子查询中出现的“子查询定义”语句可以引用已定义的子查询名称。)

·         In a query with set operators, the set operator subquery cannot contain the subquery_factoring_clause, but the FROM subquery can contain the subquery_factoring_clause.

(在带集合操作的查询语句中,除FROM子查询外,子查询中不能出现“子查询定义”语句。但通过测试后感觉并不是这样,详见后面的示例。不知道是不是对此段英文理解错误。)

二、        个人总结及示例:

1、浅谈该功能的oracle 原理:先对子查询起个名称,然后可以多处引用,并像内联视图或临时表一样对待,从而减少访问基表的次数,提高运行效率。

2、使用时机,一般在需要多次访问一个子查询结果集的情况下使用。注意oracle数据库版本的限制,该语句是在9i及以后数据库版本中才出现的。

3、使用原则及相关示例:

1> 定义之后一定要引用
SQL> select * from  (
2 WITH t_with_3 as (SELECT '1' a ,'3' b FROM DUAL)
3  SELECT '1' a ,'1' b FROM dual -- 此处未引用
4  )
5  /
WITH t_with_3 as (SELECT '1' a ,'3' b FROM DUAL)
*
ERROR 位于第2行:
ORA-32035: unreferenced query name defined in WITH clause

2>、同一个主查询语句的同级别的地方,子查询定义语句只能出现一个,而不能并列出现多个
例1
SQL>  SELECT  *
2    FROM (
3          WITH
4            t_with_1 AS (SELECT '1' a ,'1' b FROM DUAL),
5          WITH  -- 此处再次出现定义
6            t_with_2 AS (SELECT '1' a ,'2' b FROM DUAL)
7*         SELECT x.a , x.b xb ,y.b yb FROM t_with_1 x , t_with_2 y
8  /
WITH
*
ERROR 位于第5行:
ORA-00903: invalid table name

例2:带集合操作的查询

SQL>  SELECT  *
2    FROM (
3          WITH
4            t_with_1 AS (SELECT '1' a ,'1' b FROM DUAL)
5          --此后的整个语句被认为是一个主查询语句
6          SELECT x.a , x.b FROM t_with_1 x
7          union all
8          WITH  -- 此处再次出现定义
9            t_with_2 AS (SELECT '1' a ,'2' b FROM DUAL)
10*         SELECT y.a ,y.b FROM t_with_2 y
11  /
SELECT y.a ,y.b FROM t_with_2 y
*
ERROR 位于第10行:
ORA-32034: unsupported use of WITH clause

3>、不能嵌套定义
SQL>  SELECT  *
2    FROM (
3          WITH
4            t_with_1 AS (  select * from (
5                                          WITH t_with_x as (SELECT '1' a ,'x' b FROM DUAL)
6                                          SELECT '1' a ,'1' b FROM t_with_x
7                                          )
8                         ),
9            t_with_2 AS (SELECT '1' a ,'2' b FROM DUAL)
10*         SELECT x.a , x.b xb ,y.b yb FROM t_with_1 x , t_with_2 y
11  /
WITH t_with_x as (SELECT '1' a ,'x' b FROM DUAL)
*
ERROR 位于第5行:
ORA-32034: unsupported use of WITH clause

4>、可"嵌套"引用(未定义之前不能引用)
SQL>  SELECT  *
2    FROM (
3          WITH
4            t_with_1 AS (SELECT '1' a ,'1' b FROM DUAL),
5            t_with_2 AS (SELECT '1' a ,'2' b FROM DUAL),
6            t_with_3 as (SELECT *  FROM t_with_1)
7          SELECT x.a , x.b xb ,y.b yb,z.b zb FROM t_with_1 x , t_with_2 y ,t_with_3 z
8*         )
9  /

A X Y Z
- - - -
1 1 2 1

5>、可在大多数类型的子查询中引用
SQL>  SELECT a ,b
2    FROM (
3          WITH
4            t_with AS (SELECT '1' a FROM DUAL)
5          SELECT x.a ,(select a from t_with) b
6            FROM t_with x,
7                 (select a from t_with) y
8           WHERE x.a= y.a
9              and x.a = (select a from t_with)
10*         )
11  /

A B
- -
1 1

6>、可在大多数类型的子查询中定义及引用
例1
SQL>  SELECT a ,b
2    FROM (
3          WITH
4            t_with AS (SELECT '1' a FROM DUAL)
5          SELECT x.a ,(
6                        WITH t_with_z as (SELECT '1' a FROM t_with )
7                        SELECT  s_1.a FROM t_with_z s_1 ,t_with s_2
8                       ) b
9            FROM t_with x,
10                 (  WITH t_with_y as (SELECT '1' a FROM t_with)
11                    SELECT  f_1.a FROM t_with_y f_1, t_with f_2
12                 ) y
13           WHERE x.a= y.a
14              and x.a = ( WITH t_with_x as (SELECT '1' a FROM t_with)
15                          SELECT  w_1.a FROM t_with_x w_1 ,t_with w_2
16                        )
17*        )
18  /

A B
- -
1 1

例2:带集合操作的查询( 注意并非FROM子查询中才能使用“子查询定义”从句)
SQL>  SELECT  *
2    FROM (
3          WITH
4              t_with_1 AS (SELECT '1' a ,'1' b FROM DUAL)
5          SELECT x.a , x.b ,'x' c FROM t_with_1 x
6          union all
7          SELECT y.a ,y.b ,  (WITH
8                                  t_with_x AS (SELECT * FROM t_with_1)
9                                  SELECT a FROM t_with_x )
10            FROM (  WITH
11                       t_with_2 AS (SELECT '1' a ,'2' b FROM DUAL)
12                    SELECT a ,b FROM t_with_2
13                                ) y
14          WHERE  y.a = (  WITH
15                              t_with_3 AS (SELECT '1' a ,'2' b FROM DUAL)
16                              SELECT a FROM t_with_3
17                       )
18*         )
19  /

A B C
- - -
1 1 x
1 2 1

给我老师的人工智能教程打call!http://blog.csdn.net/jiangjunshow

子查询定义从句总结(WITH AS 语句)相关推荐

  1. MySQL数据库---子查询insert,update,delete语句中嵌套子查询

    十.子查询的使用(重点) 1.子查询:指的是查询语句,嵌套查询语句---->一般是放在where子句中,表示条件. 2.子查询的应用使用场景: 2.1查询过程中,虽然给了条件,但是条件的结果并不 ...

  2. power bulider 9.0 如何将sql语句查询的值返回给变量_SQL—你应该知道的子查询

    (本文结合<SQL基础教程>整理) 文章结构 视图 子查询 变量子查询 关联子查询 如何用SQL解决业务问题 常见函数 视图 视图的定义: 视图究竟是什么呢?如果用一句话概述的话,就是&q ...

  3. mysql+sql+子查询语句_SQL子查询

    子查询或内部查询或嵌套查询在另一个SQL查询的查询和嵌入式WHERE子句中. 子查询用于返回将被用于在主查询作为条件的数据,以进一步限制要检索的数据. 子查询可以在SELECT,INSERT,UPDA ...

  4. oracle 语句 子查询,Oracle子查询

    在本教程中,您将了解有助于构建更多可读查询的Oracle子查询,并可在不使用复杂联接或联合的情况下编写查询. Oracle子查询简介 子查询是嵌套在另一个语句(如SELECT,INSERT,UPDAT ...

  5. MSSQL之五 连接查询与子查询

    在一个高级的数据库中,被浏览的数据可以被存储在多个表中.当你需要从相关的表中浏览数据的时候,你可以通过将公用的属性连接表查询数据.你可以使用子查询,这里一个查询的结果被用作另一个查询的条件的输入. 本 ...

  6. 【3-12】数据库子查询及聚合函数

    [3-12]数据库子查询及聚合函数 一.子查询 定义:把一条查询语句当做值来使用 注:子句的查询结果必须是一列 子句可以返回多行数据,但必须是一列 (1)基本多条件嵌套查询: select *from ...

  7. 16、子查询改写为表连接

    子查询如递归函数一样,有时侯能达到事半功倍的效果,但是其执行效率较低.与表连接相比,子查询比较灵活,方便,形式多样,适合作为查询的筛选条件,而表连接更适合查看多表的数据. 一般情况下,子查询会产生笛卡 ...

  8. mysql子查询字符串位置_MySql基础-子查询

    一.子查询定义 定义: 子查询允许把一个查询嵌套在另一个查询当中. 子查询用()括起来 子查询,又叫内部查询,相对于内部查询,包含内部查询的就称为外部查询. 子查询可以包含普通select可以包括的任 ...

  9. order by 子查询_视图,子查询,标量子查询,关联子查询

    视图 子查询 标量子查询 关联子查询 如何用SQL解决业务问题 各种函数 1. 视图 视图内存放SQL查询语句,运行时运行该语句.查出的数据为临时数据 创建视图 create view as 视图名称 ...

  10. 前端学数据库之子查询

    前面的话 查询数据库,当查询条件比较复杂时,常常需要用到子查询.子查询(Subquery)是指出现在其他SQL语句内的SELECT子句.本文将详细介绍子查询 定义 子查询(Subquery)是指出现在 ...

最新文章

  1. 分布式工具的一次小升级⏫
  2. abap range 或 Filter的说明
  3. python首页展示业务逻辑_每日一程-4. PyQt5-实现显示和业务逻辑分离
  4. activity 点击后传递数据给fragment_Fragment 的过去、现在和将来
  5. golang ffmpeg 做网络直播
  6. eclipse警告与报错的修复
  7. [Eclipse插件] Eclipse设置Tab键为空格(ctrl+shirt+f格式化生效)!
  8. 沃尔玛牵手Gatik推行自动驾驶试点项目 为客户配送订单
  9. 习题3.11 递归和非递归查找元素
  10. mysql读写分离(PHP类)
  11. unity 特效shader下载_Unity shader消融特效——(1)逻辑节点篇
  12. 零基础用阿里云服务器搭建网站的步骤
  13. TestBench 基本写法与框架
  14. 离散数学题目——派谁出国学习
  15. 微软Ribbon界面
  16. 已有定义int x=57,用isprime()来判断整型数x是否为素数
  17. yeelink平台试玩
  18. 普通青年、文艺青年、二B青年们的表白
  19. 社交电商的趋势布局规划?
  20. IC验证:静态时序分析

热门文章

  1. js代码编写新年倒计时
  2. 具有强大的有限元网格ANSA
  3. 介绍几款可以在手机上用来学习编程的软件
  4. java实现复制粘贴功能代码,附源代码
  5. linux shell脚本查找局域网内所有已连接的设备ip
  6. zotero中的标准和规范应该用什么类型
  7. 3D优化之ShadowGun系列三:shader系列汇总
  8. robotium和appium区别
  9. docx 2003 的补丁
  10. fseek(f,0,SEEK_SET);