zoukankan      html  css  js  c++  java
  • Oracle 左外连接的一些測试

      为了更加深入左外连接,我们做一些測试,外连接的写法有几种形式,我们能够通过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";

  • 相关阅读:
    敏捷个人手机应用:如何下载敏捷个人资料
    2014年8月10日:敏捷个人奥森跑步+慢走分享
    敏捷个人手机应用:如何进行敏捷个人练习
    敏捷个人新体系:定位
    任何社区,只要能影响他人成长的人,都可以成为敏捷个人的荣誉会员
    亲密爱人:《亲密关系》读书笔记
    亲密爱人:《亲密关系
    2014.7.12 敏捷个人奥森健步走&敏友分享会.活动报道
    开放产品开发(OPD):产品负责人的工作原则和方法
    #敏捷个人资料# 免费下载 《敏捷个人-认识自我,管理自我 v0.8.pdf》
  • 原文地址:https://www.cnblogs.com/yfceshi/p/6806397.html
Copyright © 2011-2022 走看看