为了更加深入左外连接,我们做一些測试,外连接的写法有几种形式,我们能够通过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. [ CodeVS冲杯之路 ] P1214

    不充钱,你怎么AC? 题目:http://codevs.cn/problem/1214/ 这道题类似于最长区间覆盖,仅仅是将最长区间改成了最多线段,我们贪心即可 先将线段直接右边-1,然后按左边为第一 ...

  2. struts2 json 输出日期格式不正确

    struts2 输出json中 日期出现:2013-12-17T15:57:47 错误格式的数据 原因:struts2 json插件对日期的格式化有问题 解决方法:在实体类的日期的get方法上加注解: ...

  3. go环境安装

    选择想要安装的版本: http://golangtc.com/download tar -zxf go1.8.linux-amd64.tar.gz cp -R go/ /usr/local/ vi / ...

  4. 非常好!!!Linux源代码阅读——内核引导【转】

    Linux源代码阅读——内核引导 转自:http://home.ustc.edu.cn/~boj/courses/linux_kernel/1_boot.html 目录 Linux 引导过程综述 BI ...

  5. 【转载】SQL SERVER-Delete和Truncate的区别

    转载博客:http://blog.csdn.net/dba_huangzj/article/details/7913068 背景 一般在删除表数据时候,通常会有执行两个SQL语句:delete和tru ...

  6. 牛客小白月赛3 I 排名【结构体排序/较复杂/细节】

    链接:https://www.nowcoder.com/acm/contest/87/I 来源:牛客网 题目描述 Cwbc和XHRlyb都参加了SDOI2018,他们特别关心自己的排名. 我们定义每一 ...

  7. MySQL-python install

    Redhat 7.6 yum install python-devel mysql-devel gcc -y pip install MySQL-python==1.2.5

  8. CV

    Business Analyst Resume Name:  Zhou Heng Cell:  15821661982  Email :  jackyzhouheng@gmail.com Self A ...

  9. hdu 1556 Color the ball 线段树

    题目链接:HDU - 1556 N个气球排成一排,从左到右依次编号为1,2,3....N.每次给定2个整数a b(a <= b),lele便为骑上他的“小飞鸽"牌电动车从气球a开始到气 ...

  10. CAP理论下对比ACID模型与BASE模型

    CAP介绍 Consistency(一致性), 数据一致更新,所有数据变动都是同步的.比如网购,库存减少的同时资金增多.Availability(可用性), 好的响应性能.比如支付操作10ms内响应用 ...