semijoin链接进行subquery unnesting.

drop table emp1;
drop table dept1;
create table emp1 as select * from emp;
create table dept1 as select * from dept;

SQL> select e.empno, e.deptno
  from emp1 e
 where e.deptno in (select d.deptno from dept1 d where d.loc = 'CHICAGO');  2    3 

     EMPNO     DEPTNO
---------- ----------
      7900    30
      7844    30
      7698    30
      7654    30
      7521    30
      7499    30

6 rows selected.

SQL> select e.empno, e.deptno
from emp1 e, dept1 d
where e.deptno = d.deptno
and d.loc = 'CHICAGO';  2    3    4 

     EMPNO     DEPTNO
---------- ----------
      7499    30
      7521    30
      7654    30
      7698    30
      7844    30
      7900    30

6 rows selected.


此时子查询被改写成关联,结果完全等价,是因为d.deptno上是Unique索引

那如果d.deptno不唯一呢?
SQL> select * from dept1;

    DEPTNO DNAME   LOC
---------- -------------- -------------
 10 ACCOUNTING   NEW YORK
 20 RESEARCH   DALLAS
 30 SALES   CHICAGO
 40 OPERATIONS   BOSTON
 30 SALES   CHICAGO

SQL> select e.empno, e.deptno
  from emp1 e
 where e.deptno in (select d.deptno from dept1 d where d.loc = 'CHICAGO');  2    3 

     EMPNO     DEPTNO
---------- ----------
      7900    30
      7844    30
      7698    30
      7654    30
      7521    30
      7499    30

6 rows selected.

SQL> select e.empno, e.deptno
from emp1 e, dept1 d
where e.deptno = d.deptno
and d.loc = 'CHICAGO';  2    3    4 

     EMPNO     DEPTNO
---------- ----------
      7499    30
      7499    30
      7521    30
      7521    30
      7654    30
      7654    30
      7698    30
      7698    30
      7844    30
      7844    30
      7900    30

     EMPNO     DEPTNO
---------- ----------
      7900    30

12 rows selected.


改写成关联后结果就翻倍了得去从
SQL> select e.empno, e.deptno
from emp1 e, dept1 d
where e.deptno = d.deptno
and d.loc = 'CHICAGO'
group by e.empno, e.deptno  2    3    4    5  ;

     EMPNO     DEPTNO
---------- ----------
      7844    30
      7521    30
      7698    30
      7900    30
      7654    30
      7499    30

6 rows selected.

 

转载于:https://www.cnblogs.com/zhaoyangjian724/p/3798099.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值