关于oracle中的半连接(r3笔记55天)

表的连接在sql语句中尤为重要。外连接,内连接,半连接,反连接等等各种连接,看似简单的一个连接里面还是有不少的细节的。对于sql调优来说也是很重要的。 像下面的形式的sql就属于半连接,使用了in子句,对于exists的实现也是属于半连接。

--in半连接
SQL> select dname from dept dept where deptno in (select deptno  from emp emp);
DNAME
--------------
RESEARCH
SALES
ACCOUNTING

--exists半连接
SQL> select dname from dept dept where exists (select null from emp emp  where emp.deptno=dept.deptno)
  2  /
DNAME
--------------
RESEARCH
SALES
ACCOUNTING

可能对于上面两种连接大家不以为然,认为把需要用到的表直接放在from子句后效果是一致的,答案也不是肯定的。 比如下面的形式,可能输出的结果就多了很多。大概14条记录,但是通过半连接的方式会输出3行记录。

SQL>  select dept.dname from dept  dept,emp empwhere dept.deptno=emp.deptno;  
DNAME
--------------
RESEARCH
SALES
SALES
RESEARCH
SALES
SALES
ACCOUNTING
RESEARCH
ACCOUNTING
SALES
RESEARCH
SALES
RESEARCH
ACCOUNTING
14  rows selected.

所以说如果要得到一个相同的输出结果,还是需要distinct+inner join

SQL> select distinct dept.dname from dept dept,emp emp where dept.deptno=emp.deptno;

DNAME -------------- ACCOUNTING RESEARCH SALES 对于半连接的可替换实现,大体有以下几种方式

--使用集合
select dept.dname from dept dept,
(select deptno from  dept
intersect
select deptno from emp emp)b
where dept.deptno=b.deptno  ;
DNAME
--------------
ACCOUNTING
RESEARCH
SALES

--使用any
SQL> select dept.dname from dept dept where deptno=any(select deptno from emp emp);
DNAME
--------------
RESEARCH
SALES
ACCOUNTING

--使用distinct和内连接
SQL> select distinct emp.deptno  from dept dept,emp emp
    where dept.deptno=emp.deptno;
     DEPTNO
----------
        30
        20
        10
SQL> select  distinct dept.deptno from dept  dept,emp emp
        where dept.deptno=emp.deptno;
     DEPTNO
----------
        30
        20
        10

大体说了下关于半连接的一些实现,可能在实际的使用中,最直观的感受还是通过执行计划来看到。 启用了半连接,在执行计划中会有semi的字样。

也可以手动指定不需要走半连接。使用Hint no_semijoin

原文发布于微信公众号 - 杨建荣的学习笔记(jianrong-notes)

原文发表时间:2014-11-15

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏乐沙弥的世界

使用 SQLNET.EXPIRE_TIME 清除僵死连接

    数据库连接的客户端异常断开后,其占有的相应并没有被释放,如从v$session视图中依旧可以看到对应的session处于inactive,且对应的服务器...

2452
来自专栏张善友的专栏

如何分析Performance Monitor (PerfMon) Log

  Windows 2003 和xp提供了性能监视器的几个命令行工具,他们是logman utility (logman.exe),relog utility ...

2048
来自专栏游戏杂谈

as3翻牌动画

----------------------------------------------------

1142
来自专栏技术小讲堂

LINQ to SQL(2):生成对象模型

在LINQ to SQL中,可以使用自己的编程语言的对象模型映射到关系数据库,在上一节课,已经有一部分内容,简单的介绍了一下这种对象模型的结构,这一节,我们主要...

2864
来自专栏乐沙弥的世界

Oracle Net Services - Tracing and Logging at a Glance

    Oracle Net trace 用于跟踪或调试oracle连接故障,连接异常断开或者连接超时等情形,通过产生详细的跟踪信息来进行分析和诊断Oracle...

683
来自专栏蓝天

__lll_mutex_lock_wait的错误原因

运行下面的代码,即可重现上面的__lll_mutex_lock_wait()问题:

2594
来自专栏乐沙弥的世界

ORA-32004 的错误处理

启动数据库时,收到了ORA-32004 的错误,错误多是一些过时且在当前版本中不在使用的参数,如果碰到类似的错误,只需要将其

1152
来自专栏wOw的Android小站

[Android][Framework] 无障碍快捷方式相关代码

问题:无障碍快捷方式(Accessibility Shortcut)打开不生效。

2701
来自专栏ASP.NET MVC5 后台权限管理系统

ASP.NET MVC5+EF6+EasyUI 后台管理系统(75)-微信公众平台开发-用户管理

前言 本节主要是关注者(即用户)和用户组的管理,微信公众号提供了用户和用户组的管理,我们可以在微信公众号官方里面进行操作,添加备注和标签,以及移动用户组别,同...

5586
来自专栏沃趣科技

Oracle 12c ASM专题|Flex磁盘组到底有多Fexible?

原文链接 https://martincarstenbach.wordpress.com/2017/08/22/12-2-new-feature-the-fle...

3566

扫码关注云+社区

领取腾讯云代金券