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";

  • 相关阅读:
    Jackcard类似度和余弦类似度(向量空间模型)的java实现
    Android Wear之android穿戴式设备应用开发平台
    poj 2955 Brackets 括号匹配 区间dp
    Gradle自己定义插件
    C语言之基本算法11—牛顿迭代法求平方根
    jquery ajax实现省市二级联动
    从0開始学习 GitHub 系列之「07.GitHub 常见的几种操作」
    Android Widget和悬浮窗 原理
    怎样推断一个数的二进制有多少个1
    Mac OSX Yosemite 10.10 brew 错误:mktemp: mkdtemp failed on /tmp/git-LIPo: No such file or directory
  • 原文地址:https://www.cnblogs.com/yfceshi/p/6806397.html
Copyright © 2011-2022 走看看