楼主: dingjun123

[精华] Outer Join新旧语法对比分析

[复制链接]
论坛徽章:
9
ITPUB9周年纪念徽章
日期:2010-10-08 09:28:522010广州亚运会纪念徽章:击剑
日期:2010-11-03 11:00:36ITPUB十周年纪念徽章
日期:2011-11-01 16:25:512012新春纪念徽章
日期:2012-01-04 11:56:19奥运会纪念徽章:摔跤
日期:2012-08-21 10:04:04优秀写手
日期:2014-02-15 06:00:132014年新春福章
日期:2014-02-18 16:44:08马上有对象
日期:2014-02-18 16:44:08马上加薪
日期:2014-05-19 11:17:08
31#
发表于 2010-10-4 13:20 | 只看该作者

回复 #31 xysb 的帖子

where a.id=b.id(+) and b.name = c.name(+) and c.id(+) = d.id.
如果将上面的写法用另外的方式改写一下,以下的写法对吗?


  from a left outer join b on a.id = b.id
  left outer join c on b.name = c.name
  right outer join d on c.id = d.id;

  这末写正确吗??

[ 本帖最后由 ccsnmoracle 于 2010-11-8 01:25 编辑 ]

使用道具 举报

回复
论坛徽章:
9
ITPUB9周年纪念徽章
日期:2010-10-08 09:28:522010广州亚运会纪念徽章:击剑
日期:2010-11-03 11:00:36ITPUB十周年纪念徽章
日期:2011-11-01 16:25:512012新春纪念徽章
日期:2012-01-04 11:56:19奥运会纪念徽章:摔跤
日期:2012-08-21 10:04:04优秀写手
日期:2014-02-15 06:00:132014年新春福章
日期:2014-02-18 16:44:08马上有对象
日期:2014-02-18 16:44:08马上加薪
日期:2014-05-19 11:17:08
32#
发表于 2010-10-4 14:21 | 只看该作者
原帖由 ocpdba591 于 2010-9-4 11:44 发表
不知楼主说的结果是不是语句执行顺序问题:

scott@orcl>select e.ename,d.dname from emp e left outer join dept d on d.deptno=e.deptno and e.ename='SCOTT';

ENAME      DNAME
---------- --------------
SMITH
ALLEN
WARD
JONES
MARTIN
BLAKE
CLARK
SCOTT      RESEARCH
KING
TURNER
ADAMS
JAMES
FORD
MILLER

已选择14行。


其实上面的语句我们主要关注下on和left outer join的执行顺序就可以理解了:
首先要知道on 是优先于left outer join先执行的
所以on过滤掉的emp表结果,最后又被left outer join拿了回来。

scott@orcl>select e.ename,d.dname from emp e left outer join dept d on e.deptno=d.deptno where e.ename='SCOTT';

ENAME      DNAME
---------- --------------
SCOTT      RESEARCH

上面的语句就不一样了,where 是在left outer join后执行的,所以是最终的过滤结果。


按照楼主的说法,由于 on起不到过滤的作用
  select e.ename,d.dname from emp e left outer join dept d on d.deptno=e.deptno and e.ename='SCOTT';

  select e.ename,d.dname from emp e left outer join dept d on d.deptno=e.deptno ;
的结果是等价的??

可不可以认为,新的语法就是刻意地把连接条件和过滤条件分开。
这样一来可以使逻辑更清晰。

使用道具 举报

回复
论坛徽章:
4
开发板块每日发贴之星
日期:2007-07-23 01:03:36CTO参与奖
日期:2009-02-20 09:44:202010新春纪念徽章
日期:2010-03-01 11:20:052013年新春福章
日期:2013-02-25 14:51:24
33#
发表于 2010-11-3 10:47 | 只看该作者
占个地盘,等待更新

使用道具 举报

回复
论坛徽章:
9
ITPUB9周年纪念徽章
日期:2010-10-08 09:28:522010广州亚运会纪念徽章:击剑
日期:2010-11-03 11:00:36ITPUB十周年纪念徽章
日期:2011-11-01 16:25:512012新春纪念徽章
日期:2012-01-04 11:56:19奥运会纪念徽章:摔跤
日期:2012-08-21 10:04:04优秀写手
日期:2014-02-15 06:00:132014年新春福章
日期:2014-02-18 16:44:08马上有对象
日期:2014-02-18 16:44:08马上加薪
日期:2014-05-19 11:17:08
34#
发表于 2010-11-8 02:04 | 只看该作者
其实,dingjun123 sir 和 ocpdba591 sir的观点是一致的,只是说法不同。(我的理解

  〉〉外连接中的on不需要过滤基表数据,过滤基表数据是在where里做的,on只是连接条件,根据连接条件找匹配的从表数据,找不到匹配的从表行,则置空。

  〉〉首先要知道on 是优先于left outer join先执行的,所以on过滤掉的emp表结果,最后又被left outer join拿了回来。

把两位的观点结合起来就应该是:

  on关键字,的确是连接条件,它不能过滤基表。过滤不了的原因是on过滤掉的emp表结果,最后又被left outer join拿了回来。


以下就是个想法。
>> select e.ename,d.dname from emp e left outer join dept d on d.deptno=e.deptno and e.ename='SCOTT';

  伪代码

    for rec_e in ( select ename from emp e ) loop
        for rec_d in ( select dname from dept d where d.deptno = rec_e.deptno ) loop
             if rec_d != NULL and rec_e..ename='SCOTT' then
                show (rec_e.ename,rec_d.name);
             else
                show (rec_e.ename,null);   --on过滤掉的emp表结果,最后又被left outer join拿了回来。
             end if;

        end loop;
     end loop;

[ 本帖最后由 ccsnmoracle 于 2010-11-9 07:25 编辑 ]

使用道具 举报

回复
论坛徽章:
7
ITPUB十周年纪念徽章
日期:2011-11-01 16:23:26现代
日期:2013-09-13 12:03:19优秀写手
日期:2014-03-25 05:59:50秀才
日期:2017-09-18 17:04:46蒙奇·D·路飞
日期:2018-09-10 10:43:30妮可·罗宾
日期:2018-12-20 17:00:02弗兰奇
日期:2020-03-28 20:32:37
35#
发表于 2010-11-9 11:18 | 只看该作者
mark

使用道具 举报

回复
论坛徽章:
27
数据库板块每日发贴之星
日期:2010-06-17 01:01:07迷宫蛋
日期:2011-07-07 15:25:46紫蛋头
日期:2011-08-10 10:31:56ITPUB十周年纪念徽章
日期:2011-09-27 16:33:28ITPUB十周年纪念徽章
日期:2011-11-01 16:25:222012新春纪念徽章
日期:2012-02-07 09:59:35ITPUB知识分享者
日期:2012-02-20 17:49:25铁扇公主
日期:2012-02-21 15:02:40ITPUB年度最佳BLOG写作奖
日期:2012-03-13 17:09:53ITPUB 11周年纪念徽章
日期:2012-10-09 18:14:48
36#
发表于 2011-2-15 21:59 | 只看该作者
原帖由 ccsnmoracle 于 2010-10-4 14:21 发表


按照楼主的说法,由于 on起不到过滤的作用
  select e.ename,d.dname from emp e left outer join dept d on d.deptno=e.deptno and e.ename='SCOTT';

  select e.ename,d.dname from emp e left outer join dept d on d.deptno=e.deptno ;
的结果是等价的??

可不可以认为,新的语法就是刻意地把连接条件和过滤条件分开。
这样一来可以使逻辑更清晰。



使用道具 举报

回复
论坛徽章:
27
数据库板块每日发贴之星
日期:2010-06-17 01:01:07迷宫蛋
日期:2011-07-07 15:25:46紫蛋头
日期:2011-08-10 10:31:56ITPUB十周年纪念徽章
日期:2011-09-27 16:33:28ITPUB十周年纪念徽章
日期:2011-11-01 16:25:222012新春纪念徽章
日期:2012-02-07 09:59:35ITPUB知识分享者
日期:2012-02-20 17:49:25铁扇公主
日期:2012-02-21 15:02:40ITPUB年度最佳BLOG写作奖
日期:2012-03-13 17:09:53ITPUB 11周年纪念徽章
日期:2012-10-09 18:14:48
37#
发表于 2011-2-15 22:02 | 只看该作者

使用道具 举报

回复
论坛徽章:
1
ITPUB十周年纪念徽章
日期:2011-11-01 16:26:59
38#
发表于 2011-9-14 13:51 | 只看该作者
顶一个

使用道具 举报

回复
论坛徽章:
1
ITPUB十周年纪念徽章
日期:2011-11-01 16:26:59
39#
发表于 2011-9-14 15:32 | 只看该作者
希望newkid和兔子哥多讲经啊,谢谢了

使用道具 举报

回复
论坛徽章:
1
ITPUB十周年纪念徽章
日期:2011-11-01 16:25:22
40#
发表于 2011-9-27 10:14 | 只看该作者
6#


使用道具 举报

回复

您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

TOP技术积分榜 社区积分榜 徽章 团队 统计 知识索引树 积分竞拍 文本模式 帮助
  ITPUB首页 | ITPUB论坛 | 数据库技术 | 企业信息化 | 开发技术 | 微软技术 | 软件工程与项目管理 | IBM技术园地 | 行业纵向讨论 | IT招聘 | IT文档
  ChinaUnix | ChinaUnix博客 | ChinaUnix论坛
CopyRight 1999-2011 itpub.net All Right Reserved. 北京盛拓优讯信息技术有限公司版权所有 联系我们 未成年人举报专区 
京ICP备16024965号-8  北京市公安局海淀分局网监中心备案编号:11010802021510 广播电视节目制作经营许可证:编号(京)字第1149号
  
快速回复 返回顶部 返回列表