> 데이터 베이스 > MySQL 튜토리얼 > 关于Oracle中的半连接

关于Oracle中的半连接

WBOY
풀어 주다: 2016-06-07 16:43:09
원래의
1137명이 탐색했습니다.

表的连接在sql语句中尤为重要。外连接,内连接,半连接,反连接等等各种连接,看似简单的一个连接里面还是有不少的细节的。对于s

表的连接在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

Oracle半连接学习总结 

本文永久更新链接地址:

linux

관련 라벨:
원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿