ITPub博客

首页 > 数据库 > Oracle > outer join新旧语法分析

outer join新旧语法分析

原创 Oracle 作者:pwz1688 时间:2014-01-07 17:22:05 0 删除 编辑
从Oracle9i开始,对于外连接(Outer join)Oracle支持SQL92标准:这个标准有很多新的连接语法。外连接的新语法有left outer join和rigth outer join以及full outer join,旧语法外连接使用+号,
另外,旧语法无法实现full outer join,只能用union all来代替。Oracle也强烈建议9i以及之后的版本使用新的外连接语法。
outer join外连接有基表和从表的概念,基表也就是参考表,此表的内容会在outer join中全部选中,然后基表根据join的条件到从表中选出从表记录,如果满足条件则按从表实际内容选出,否则没有找到则从表对应行的所表列值为null。
就新语法而言,比如
左外链接(left outer  join)左边的表是基表,右边的表是从表,如a left join b则a为基表,b为从表;
右外链接(rigth outer join)右边的表是基表,左边的表是从表,如a rigth join b则a为从表,b为基表;
全链接(full outer join)比较特殊,左右边表互为基表和从表,如a full join b则a,b互为基表和从表。
旧语法来说,在where条件中无(+)号的表达式中的列所属表为基表,有(+)号的表达式中的列所属表为从表,比如where a.id=b.id(+)则a为基表,b为从表。
下面测试下新旧语法外连接的差别。
表a,b,c初始化脚本如下:

点击(此处)折叠或打开

  1. SQL> drop table a;

  2. 表已删除。

  3. SQL> create table a as
  4.   2 select level id,'x'||level name
  5.   3 from dual connect by level<5
  6.   4 union all
  7.   5 select level,'y'||level
  8.   6 from dual connect by level<5;

  9. 表已创建。

  10. SQL> drop table b;

  11. 表已删除。

  12. SQL> create table b as
  13.   2 select level id,'x'||level name
  14.   3 from dual connect by level<3;

  15. 表已创建。

  16. SQL> drop table c;
  17. drop table c
  18.            *
  19. 第 1 行出现错误:
  20. ORA-00942: 表或视图不存在

  21. SQL> create table c as
  22.   2 select level id,'y'||level name
  23.   3 from dual connect by level<3;

  24. 表已创建。

  25. SQL> select * from a;

  26.         ID NAME
  27. ---------- -----------------------------------------

  28.          1 x1
  29.          2 x2
  30.          3 x3
  31.          4 x4
  32.          1 y1
  33.          2 y2
  34.          3 y3
  35.          4 y4

  36. 已选择8行。

  37. SQL> select * from b;

  38.         ID NAME
  39. ---------- -----------------------------------------

  40.          1 x1
  41.          2 x2

  42. SQL> select * from c;

  43.         ID NAME
  44. ---------- -----------------------------------------

  45.          1 y1
  46.          2 y2
  47.                                                                               
外连接旧语法(+)如下:

点击(此处)折叠或打开

  1. SQL> show linesize;
  2. linesize 80
  3. SQL> set linesize 200;
  4. SQL> column name format a10
  5. SQL> select * from a,b
  6.   2 where a.id=b.id(+) and a.name like 'x%';

  7.         ID NAME ID NAME
  8. ---------- ---------- ---------- ----------

  9.          1 x1 1 x1
  10.          2 x2 2 x2
  11.          4 x4
  12.          3 x3

新语法left(rigth/full) outer join测试代码如下:

点击(此处)折叠或打开

  1. SQL> set null null
  2. SQL> select * from a left join b
  3.   2 on a.id=b.id and a.name like 'x%';

  4.         ID NAME ID NAME
  5. ---------- ---------- ---------- ----------

  6.          1 x1 1 x1
  7.          2 x2 2 x2
  8.          3 x3 null null
  9.          4 x4 null null
  10.          1 y1 null null
  11.          2 y2 null null
  12.          3 y3 null null
  13.          4 y4 null null

  14. 已选择8行。

  15. SQL> select * from a left join b
  16.   2 on a.id=b.id
  17.   3 where a.name like 'x%';

  18.         ID NAME ID NAME
  19. ---------- ---------- ---------- ----------

  20.          1 x1 1 x1
  21.          2 x2 2 x2
  22.          4 x4 null null
  23.          3 x3 null null

  24. SQL> select * from a left join b
  25.   2 on a.name like 'x%'
  26.   3 where a.id=b.id;

  27.         ID NAME ID NAME
  28. ---------- ---------- ---------- ----------

  29.          1 x1 1 x1
  30.          2 x2 2 x2


从上面新语法测试代码第一个sql语句中可知,外连接中的on不需要过滤基表数据,过滤基表数据是在where里做的,on只是连接条件,根据连接条件找匹配的从表数据,找不到匹配的从表行,则置空。简单来说on关键字,只是连接条件,它不能过滤基表。过滤不了的原因是on过滤掉的a表结果,最后又被left outer join拿了回来。

来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/21251711/viewspace-1068010/ ,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论

注册时间:2009-03-30

  • 博文量
    106
  • 访问量
    736036