楼主: dingjun123

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

[复制链接]
论坛徽章:
1
ITPUB十周年纪念徽章
日期:2011-11-01 16:25:22
41#
发表于 2011-9-27 10:17 | 只看该作者
还希望研究一下把(+)嵌入到表达式的写法:

select * from a left join b on a.name='a' and a.id=b.id;

Execution Plan
----------------------------------------------------------
Plan hash value: 1365417139

---------------------------------------------------------------------------
| Id  | Operation          | Name | Rows  | Bytes | Cost (%CPU)| Time     |
---------------------------------------------------------------------------
|   0 | SELECT STATEMENT   |      |     2 |    80 |     6  (17)| 00:00:01 |
|*  1 |  HASH JOIN OUTER   |      |     2 |    80 |     6  (17)| 00:00:01 |
|   2 |   TABLE ACCESS FULL| A    |     2 |    40 |     3   (0)| 00:00:01 |
|   3 |   TABLE ACCESS FULL| B    |     1 |    20 |     2   (0)| 00:00:01 |
---------------------------------------------------------------------------

Predicate Information (identified by operation id):
---------------------------------------------------

   1 - access("A"."ID"="B"."ID"(+) AND "A"."NAME"=CASE  WHEN
              ("B"."ID"(+) IS NOT NULL) THEN 'a' ELSE 'a' END )

从谓词判断可以看出它等价于:

select * from a,b
where a.id=b.id(+)
      AND "A"."NAME"=CASE WHEN ("B"."ID"(+) IS NOT NULL) THEN 'a' ELSE 'a' END;


newkid大师 这个执行出来不等价啊. CASE WHEN ("B"."ID"(+) IS NOT NULL) THEN 'a' ELSE 'a' END;  按我理解这里的 ELSE 去掉还差不多 ..

使用道具 举报

回复
论坛徽章:
4
ITPUB 11周年纪念徽章
日期:2012-10-09 18:16:00复活蛋
日期:2013-02-25 11:15:562013年新春福章
日期:2013-02-25 14:51:24保时捷
日期:2013-09-10 10:19:16
42#
发表于 2013-2-20 17:29 | 只看该作者
不错的帖子,让我了解到outer join 中的on是连接条件,和where过滤条件是不一样的,以前以为它们两个是相同的,现在终于明白了,还需要再消化一下。

使用道具 举报

回复
论坛徽章:
0
43#
发表于 2013-3-22 11:29 | 只看该作者
兔子官人,下面洗洗睡了

使用道具 举报

回复
论坛徽章:
4
三菱
日期:2013-10-10 17:54:56ITPUB社区12周年站庆徽章
日期:2013-10-15 09:38:49ITPUB社区12周年站庆徽章
日期:2013-10-28 17:22:35ITPUB社区12周年站庆徽章
日期:2013-11-04 09:30:01
44#
发表于 2013-10-30 13:40 | 只看该作者
厉害啊,学习

使用道具 举报

回复
论坛徽章:
10
授权会员
日期:2007-08-09 15:37:26会员2007贡献徽章
日期:2007-09-26 18:42:10ITPUB元老
日期:2007-10-15 21:12:09ITPUB新首页上线纪念徽章
日期:2007-10-20 08:38:44ITPUB十周年纪念徽章
日期:2011-11-01 16:20:28灰彻蛋
日期:2013-06-24 14:20:02
45#
发表于 2013-11-1 16:51 | 只看该作者
我的习惯 SELECT .... FROM TABLEA,TABLEB,... WHERE (A,B,...关联条件) AND (A 过滤条件) AND (B 过滤条件) AND (...过滤条件)
我认为 这样SQL逻辑更清晰,所以我更喜欢+

如果使用LEFT/right JOIN: 从sql里找到A,B,C更耗时间,然后再分析他们的关联时要记住是left 还是 right join......记不住,用+一眼就能看清楚
如果sql过于复杂,那我会认为表结构设计得不合理

使用道具 举报

回复
论坛徽章:
737
季节之章:春
日期:2015-07-31 17:16:29ITPUB季度 技术新星
日期:2014-07-17 14:37:00季节之章:秋
日期:2015-07-31 17:16:14季节之章:夏
日期:2015-07-31 17:16:29股神
日期:2014-10-15 09:23:31衰神
日期:2014-10-20 22:47:12季节之章:冬
日期:2015-07-31 17:16:14红钻
日期:2014-12-16 17:51:41洛杉矶湖人
日期:2016-09-23 08:18:15布鲁克林篮网
日期:2016-09-23 08:17:18
46#
发表于 2013-11-4 22:53 | 只看该作者
话说怎么没看到兔子的pdf啊

使用道具 举报

回复

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

本版积分规则 发表回复

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