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

  • 相关阅读:
    老虎Sitemap生成器 0.5.3
    东北虎介绍
    老虎Sitemap生成器 0.5.2
    面向对象的 Javascript 语言特性:作用域
    诚聘ASP.NET开发人员[杭州]
    treegridview
    老虎Sitemap生成器 0.2
    1
    面向对象的 Javascript 函数重载和类型检查
    欢迎使用 老虎关键词排名查询器 v0.2.5
  • 原文地址:https://www.cnblogs.com/yfceshi/p/6806397.html
Copyright © 2011-2022 走看看