为了更加深入左外连接,我们做一些測试,外连接的写法有几种形式,我们能够通过10053跟踪到终于SQL转换的形式。

--初始化数据

create table A

(

  id number,

  age number

);

create table b

(

  id number,

  age number

);

insert into A values(1,10);

insert into A values(2,20);

insert into A values(3,30);

insert into B values(1,10);

insert into B values(2,20);

commit;

--用10053找到终于转换后的SQL

alter session set session_cached_cursors =0;

alter session set events '10053 trace name context forever, level  1';

explain plan for select * from A left join B on A.id = B.id and A.age > 5;

explain plan for select * from A left join B on A.id = B.id WHERE A.age > 5;

explain plan for select * from A left join B on A.id = B.id and b.age > 5;

explain plan for select * from A left join B on A.id = B.id where b.age > 5;

alter session set events '10053 trace name context off' ;





select * from A left join B on A.id = B.id and A.age > 5;

        ID        AGE         ID        AGE

---------- ---------- ---------- ----------

         1         10          1         10

         2         20          2         20

         3         30

--Final query after transformations:

SELECT "A"."ID" "ID", "A"."AGE" "AGE", "B"."ID" "ID", "B"."AGE" "AGE"

  FROM "GG_TEST"."A" "A", "GG_TEST"."B" "B"

 WHERE "A"."ID" = "B"."ID"(+)

   AND "A"."AGE" > CASE WHEN("B"."ID"(+) IS NOT NULL) THEN 5 ELSE 5 END





select * from A left join B on A.id = B.id WHERE A.age > 5;

        ID        AGE         ID        AGE

---------- ---------- ---------- ----------

         1         10          1         10

         2         20          2         20

         3         30

--Final query after transformations:

SELECT "A"."ID" "ID", "A"."AGE" "AGE", "B"."ID" "ID", "B"."AGE" "AGE"

  FROM "GG_TEST"."A" "A", "GG_TEST"."B" "B"

 WHERE "A"."AGE" > 5

   AND "A"."ID" = "B"."ID"(+);





select * from A left join B on A.id = B.id and b.age > 5; 

        ID        AGE         ID        AGE

---------- ---------- ---------- ----------

         1         10          1         10

         2         20          2         20

         3         30  

--Final query after transformations:

SELECT "A"."ID" "ID", "A"."AGE" "AGE", "B"."ID" "ID", "B"."AGE" "AGE"

  FROM "GG_TEST"."A" "A", "GG_TEST"."B" "B"

 WHERE "A"."ID" = "B"."ID"(+)

   AND "B"."AGE"(+) > 5



--这样的形式你能够看到外连接失效,CBO还是很聪明的

select * from A left join B on A.id = B.id where b.age > 5;


        ID        AGE         ID        AGE

---------- ---------- ---------- ----------

         1         10          1         10

         2         20          2         20

--Final query after transformations:

SELECT "A"."ID" "ID", "A"."AGE" "AGE", "B"."ID" "ID", "B"."AGE" "AGE"

  FROM "GG_TEST"."A" "A", "GG_TEST"."B" "B"

 WHERE "B"."AGE" > 5

   AND "A"."ID" = "B"."ID";

Oracle 左外连接的一些測试的更多相关文章

  1. oracle 内连接 左外连接 右外连接的用法,(+)符号用法

    1. 内连接很简单 select A.*, B.* from A,B where A.id = B.id select A.*, B.* from A inner join B on A.id = B ...

  2. oracle 中的左外连接、右外连接、全连接

    左外连接 左外连接 全连接1.左外连接:表1 left [outer] join 表1 on 条件 在等值连接的基础上会把表1中的其他内容也展示出来 而表2只会显示符合条件的内容 . outer 可省 ...

  3. Oracle关于自连接、左外连接、右外连接、全连接

    关于自连接.左外连接.右外连接.全连接:   简单来讲,随便来个例子: A表 B表 id name id name  1 a 1 b  2 b 3 c 4 c   内连接就是左表和右表相同的数据: s ...

  4. 深入理解SQL的四种连接-左外连接、右外连接、内连接、全连接(转)

    1.内联接(典型的联接运算,使用像 =  或 <> 之类的比较运算符).包括相等联接和自然联接.     内联接使用比较运算符根据每个表共有的列的值匹配两个表中的行.例如,检索 stude ...

  5. 【转】深入理解SQL的四种连接-左外连接、右外连接、内连接、全连接

    [原文]:http://www.jb51.net/article/39432.htm 1.内联接(典型的联接运算,使用像 =  或 <> 之类的比较运算符).包括相等联接和自然联接.    ...

  6. 深入理解SQL的四种连接,左外连接,右外连接,内连接,全连接

    1.内联接(典型的联接运算,使用像 =  或 <> 之类的比较运算符).包括相等联接和自然联接.     内联接使用比较运算符根据每个表共有的列的值匹配两个表中的行.例如,检索 stude ...

  7. SQL的四种连接(左外连接、右外连接、内连接、全连接)

    1.内联接(典型的联接运算,使用像 =  或 <> 之类的比较运算符).包括相等联接和自然联接.     内联接使用比较运算符根据每个表共有的列的值匹配两个表中的行.例如,检索 stude ...

  8. Oracle SQL外连接

    SQL提供了多种类型的连接方式,它们之间的区别在于:从相互交叠的不同数据集合中选择用于连接的行时所采用的方法不同.连接类型        定义内连接           只连接匹配的行左外连接     ...

  9. 转【深入理解SQL的四种连接-左外连接、右外连接、内连接、全连接】

    转自:https://www.jb51.net/article/39432.htm 1.内联接(典型的联接运算,使用像 =  或 <> 之类的比较运算符).包括相等联接和自然联接.     ...

随机推荐

  1. 汕头市队赛 SRM 09 C 撕书

    C 撕书III-3 SRM 09 背景&&描述 琉璃双在撕书.     书总共有n页,每页都可以看作是一个数字.     琉璃读书喜欢来回地读.但他也因此发现了作者的灌水行为:有些连续 ...

  2. yii上传图片、yii上传文件、yii控件activeFileField使用

    yii框架提供了activeFileField控件来完成上传文件(当然也包括了上传图片)的操作,下面介绍yii的activeFileField使用方法.1.函数原型:public static str ...

  3. Python开发【项目】:FTP程序

    作业:开发一个支持多用户在线的FTP程序 要求: 用户加密认证 允许同时多用户登录 每个用户有自己的家目录 ,且只能访问自己的家目录 对用户进行磁盘配额,每个用户的可用空间不同 允许用户在ftp se ...

  4. 【原创】Win Server 2012R2 IIS 详细配置(多图详解)

    1. 前期准备 1) 2012系统的IIS安装的时候,需要系统安装盘里面的一些软件,因此需要在安装前将系统安装盘挂载到服务器的盘符上,以便使用. 2. 添加角色和功能 打开服务器管理器,点击管理菜单, ...

  5. Openjudge1388 Lake Counting【DFS/Flood Fill】

    http://blog.csdn.net/c20182030/article/details/52327948 1388:Lake Counting 总时间限制:   1000ms   内存限制:  ...

  6. java trim start end space

    Java program that trims starts and ends public class Program { public static String trimEnd(String v ...

  7. SQL Server 2008 R2 Build List

    By Steve Jones, 2014/09/30 (first published: 2010/05/25) This is a list of the builds for SQL Server ...

  8. How to: Launch the Debugger Automatically

    Sometimes, you may need to debug the startup code for an application that is launched by another pro ...

  9. ios 字体类型设置 倾斜加粗等

    后面加-Bold就是加粗 加-Oblique就是倾斜等 还有不懂请看http://iosfonts.com/ iPhone 5.0 iPad 5.0 Font Families: 58 Font Fa ...

  10. react with JSX for {if…else…}

    在react中用jsx渲染dom的时候经常会遇到if条件判断,然而在jsx中竟是不允许if条件判断的.以下有几种判断方式,可以根据自己的应用场景,挑选适合的 https://blog.csdn.net ...