• 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.

  • 相关阅读:
    机器学习面试
    网易有道2017内推编程题2道
    老曹眼中的网络编程基础
    MySQL索引背后的数据结构及算法原理
    [oracle] oracle-ibatis-整理
    [oracle] oracle-myibatis-整理
    [mysql] mysql-myibatis-整理
    [JS] selector 背景选择器
    [android] AndroidManifest.xml 详解
    [Eclipse] 项目编码
  • 原文地址:https://www.cnblogs.com/zhaoyangjian724/p/3798099.html
Copyright © 2020-2023  润新知