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

  • 相关阅读:
    STL逆序迭代器(reverse_iterator)
    STL容器之vector容器API(二)
    STL容器之vector容器巧用swap收缩空间
    STL容器之vector容器API(一)
    STL容器vector概念和注意事项(每次扩充都会重新开辟空间,释放原空间,即首元素地址会变一次)
    STL容器之string内存重定义
    STL容器之string与c_style类型转换
    STL容器之string插入和删除
    STL容器之string字串
    STL容器之string比较
  • 原文地址:https://www.cnblogs.com/yfceshi/p/6806397.html
Copyright © 2011-2022 走看看