12
返回列表 发新帖
楼主: fjmingyang

outer join 的执行顺序

[复制链接]
招聘 : Java研发
论坛徽章:
71
马上加薪
日期:2014-02-19 11:55:14蜘蛛蛋
日期:2012-12-26 18:16:01茶鸡蛋
日期:2012-11-16 08:12:48ITPUB 11周年纪念徽章
日期:2012-10-09 18:05:07奥运会纪念徽章:网球
日期:2012-08-23 14:58:08奥运会纪念徽章:沙滩排球
日期:2012-07-19 17:28:14版主2段
日期:2012-07-07 02:21:02咸鸭蛋
日期:2012-03-23 18:17:482012新春纪念徽章
日期:2012-02-13 15:13:512012新春纪念徽章
日期:2012-02-13 15:13:51
11#
发表于 2008-3-19 16:11 | 只看该作者
select s1.name, s2.name from s1 left join s2 on s1.id=s2.id and s2.id=2;
vs
select s1.name, s2.name from s1 left join s2 on s1.id=s2.id where s2.id=2;


[ 本帖最后由 anlinew 于 2008-3-19 16:13 编辑 ]

使用道具 举报

回复
论坛徽章:
69
林肯
日期:2013-11-27 16:16:31ITPUB十周年纪念徽章
日期:2011-11-01 16:21:15本田
日期:2013-09-23 12:45:07宝马
日期:2013-11-29 16:29:42奥运会纪念徽章:足球
日期:2012-08-06 16:26:57蜘蛛蛋
日期:2012-03-02 12:32:08ITPUB 11周年纪念徽章
日期:2012-10-09 18:06:202013年新春福章
日期:2013-02-25 14:51:24复活蛋
日期:2013-06-18 12:44:352012新春纪念徽章
日期:2012-01-04 11:51:22
12#
 楼主| 发表于 2008-3-19 16:11 | 只看该作者
SQL> select s1.name, s2.name from s1,s2 where s1.id=s2.id and s2.id=2;

NAME                 NAME
-------------------- --------------------
b                    b


Execution Plan
----------------------------------------------------------
   0      SELECT STATEMENT Optimizer=CHOOSE
   1    0   MERGE JOIN
   2    1     SORT (JOIN)
   3    2       TABLE ACCESS (FULL) OF 'S2'
   4    1     SORT (JOIN)
   5    4       TABLE ACCESS (FULL) OF 'S1'




Statistics
----------------------------------------------------------
          0  recursive calls
          0  db block gets
         14  consistent gets
          0  physical reads
          0  redo size
        428  bytes sent via SQL*Net to client
        503  bytes received via SQL*Net from client
          2  SQL*Net roundtrips to/from client
          2  sorts (memory)
          0  sorts (disk)
          1  rows processed

SQL> select s1.name, s2.name from s1,s2 where s1.id=s2.id(+) and s2.id=2;

NAME                 NAME
-------------------- --------------------
b                    b


Execution Plan
----------------------------------------------------------
   0      SELECT STATEMENT Optimizer=CHOOSE
   1    0   FILTER
   2    1     MERGE JOIN (OUTER)
   3    2       SORT (JOIN)
   4    3         TABLE ACCESS (FULL) OF 'S1'
   5    2       SORT (JOIN)
   6    5         TABLE ACCESS (FULL) OF 'S2'




Statistics
----------------------------------------------------------
          0  recursive calls
          0  db block gets
         14  consistent gets
          0  physical reads
          0  redo size
        428  bytes sent via SQL*Net to client
        503  bytes received via SQL*Net from client
          2  SQL*Net roundtrips to/from client
          2  sorts (memory)
          0  sorts (disk)
          1  rows processed

SQL> select s1.name, s3.name from s1,(select * from s2 where s2.id=2 ) s3 where
s1.id=s3.id(+);

NAME                 NAME
-------------------- --------------------
a
b                    b
c
d


Execution Plan
----------------------------------------------------------
   0      SELECT STATEMENT Optimizer=CHOOSE
   1    0   MERGE JOIN (OUTER)
   2    1     SORT (JOIN)
   3    2       TABLE ACCESS (FULL) OF 'S1'
   4    1     SORT (JOIN)
   5    4       TABLE ACCESS (FULL) OF 'S2'




Statistics
----------------------------------------------------------
          0  recursive calls
          0  db block gets
         14  consistent gets
          0  physical reads
          0  redo size
        478  bytes sent via SQL*Net to client
        503  bytes received via SQL*Net from client
          2  SQL*Net roundtrips to/from client
          2  sorts (memory)
          0  sorts (disk)
          4  rows processed

SQL>

三个语句的执行计划如上,各位给分析下

使用道具 举报

回复
论坛徽章:
59
狮子座
日期:2016-03-26 13:35:402013年新春福章
日期:2013-02-25 14:51:24双黄蛋
日期:2013-02-25 11:06:15ITPUB 11周年纪念徽章
日期:2012-10-09 18:06:20灰彻蛋
日期:2012-04-25 13:19:33紫蛋头
日期:2012-03-14 11:16:09最佳人气徽章
日期:2012-03-13 17:39:18玉石琵琶
日期:2012-02-21 15:04:38鲜花蛋
日期:2011-11-30 14:13:01ITPUB十周年纪念徽章
日期:2011-11-01 16:21:15
13#
发表于 2008-3-19 16:20 | 只看该作者
这个就是外连接的概念啊,不用看执行计划就应该知道结果

左连接或者右连接,就是其中一个表的符合连接条件的记录取出来,不符合的用null表示,并不是简单的相等连接,不是=关系

使用道具 举报

回复
招聘 : Java研发
论坛徽章:
71
马上加薪
日期:2014-02-19 11:55:14蜘蛛蛋
日期:2012-12-26 18:16:01茶鸡蛋
日期:2012-11-16 08:12:48ITPUB 11周年纪念徽章
日期:2012-10-09 18:05:07奥运会纪念徽章:网球
日期:2012-08-23 14:58:08奥运会纪念徽章:沙滩排球
日期:2012-07-19 17:28:14版主2段
日期:2012-07-07 02:21:02咸鸭蛋
日期:2012-03-23 18:17:482012新春纪念徽章
日期:2012-02-13 15:13:512012新春纪念徽章
日期:2012-02-13 15:13:51
14#
发表于 2008-3-19 16:20 | 只看该作者
原帖由 anlinew 于 2008-3-19 16:11 发表
select s1.name, s2.name from s1 left join s2 on s1.id=s2.id and s2.id=2;
vs
select s1.name, s2.name from s1 left join s2 on s1.id=s2.id where s2.id=2;


select s1.name, s2.name from s1,s2 where s1.id=s2.id(+) and s2.id(+)=2;
vs
select s1.name, s2.name from s1,s2 where s1.id=s2.id(+) and s2.id=2;

使用道具 举报

回复
论坛徽章:
69
林肯
日期:2013-11-27 16:16:31ITPUB十周年纪念徽章
日期:2011-11-01 16:21:15本田
日期:2013-09-23 12:45:07宝马
日期:2013-11-29 16:29:42奥运会纪念徽章:足球
日期:2012-08-06 16:26:57蜘蛛蛋
日期:2012-03-02 12:32:08ITPUB 11周年纪念徽章
日期:2012-10-09 18:06:202013年新春福章
日期:2013-02-25 14:51:24复活蛋
日期:2013-06-18 12:44:352012新春纪念徽章
日期:2012-01-04 11:51:22
15#
 楼主| 发表于 2008-3-19 16:23 | 只看该作者
原帖由 anlinew 于 2008-3-19 16:05 发表
select s1.name, s2.name from s1,s2 where s1.id=s2.id(+) and s2.id(+)=2;



请解释下,不是很理解

使用道具 举报

回复
论坛徽章:
59
狮子座
日期:2016-03-26 13:35:402013年新春福章
日期:2013-02-25 14:51:24双黄蛋
日期:2013-02-25 11:06:15ITPUB 11周年纪念徽章
日期:2012-10-09 18:06:20灰彻蛋
日期:2012-04-25 13:19:33紫蛋头
日期:2012-03-14 11:16:09最佳人气徽章
日期:2012-03-13 17:39:18玉石琵琶
日期:2012-02-21 15:04:38鲜花蛋
日期:2011-11-30 14:13:01ITPUB十周年纪念徽章
日期:2011-11-01 16:21:15
16#
发表于 2008-3-19 16:24 | 只看该作者
sql语句决定执行计划,并不是执行计划决定sql语句

使用道具 举报

回复
论坛徽章:
69
林肯
日期:2013-11-27 16:16:31ITPUB十周年纪念徽章
日期:2011-11-01 16:21:15本田
日期:2013-09-23 12:45:07宝马
日期:2013-11-29 16:29:42奥运会纪念徽章:足球
日期:2012-08-06 16:26:57蜘蛛蛋
日期:2012-03-02 12:32:08ITPUB 11周年纪念徽章
日期:2012-10-09 18:06:202013年新春福章
日期:2013-02-25 14:51:24复活蛋
日期:2013-06-18 12:44:352012新春纪念徽章
日期:2012-01-04 11:51:22
17#
 楼主| 发表于 2008-3-19 16:49 | 只看该作者
原帖由 fjmingyang 于 2008-3-19 16:23 发表



请解释下,不是很理解

If the WHERE clause contains a condition that compares a column from table B with a constant, then the (+) operator must be applied to the column so that Oracle returns the rows from table A for which it has generated nulls for this column. Otherwise Oracle returns only the results of a simple join.

使用道具 举报

回复
论坛徽章:
1
2008新春纪念徽章
日期:2008-02-13 12:43:03
18#
发表于 2008-3-19 17:14 | 只看该作者
看来外连接确实令一些人产生一些迷惑
anlinew 已经说的很明白了,
ON  XX=XX AND XX=XX 和 ON XX=XX WHERE XX=XX得到的结果是不同的。
前者的话无论被外连接的表条件如何,始终是以主表为准,副表为空的则为null
而后者,因为在where后面XX=XX,所以会把副表为null的行去掉。
你仔细换换各种写法,就会体会的到的啦。

使用道具 举报

回复

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

本版积分规则 发表回复

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