zoukankan      html  css  js  c++  java
  • 常见的SQL等价改写

    表结构

    SQL> desc scott.emp
    Name Type Nullable Default Comments
    -------- ------------ -------- ------- --------
    EMPNO NUMBER(4) Y
    ENAME VARCHAR2(10) Y
    JOB VARCHAR2(9) Y
    MGR NUMBER(4) Y
    HIREDATE DATE Y
    SAL NUMBER(7,2) Y
    COMM NUMBER(7,2) Y
    DEPTNO NUMBER(2) Y

    SQL> desc scott.dept
    Name Type Nullable Default Comments
    ------ ------------ -------- ------- --------
    DEPTNO NUMBER(2)
    DNAME VARCHAR2(14) Y
    LOC VARCHAR2(13) Y

    半连接

    select * from scott.emp a

    where deptno in(select deptno from scott.dept b where  a.deptno = b.deptno)

    等价

    select * from scott.emp a

    where exists(select 1 from scott.dept b where  a.deptno = b.deptno)

    等价

    select * from scott.emp a,(select deptno from scott.dept ) b

    where a.deptno = b.deptno

    反连接

    select * from scott.emp a

    where deptno not in (select deptno from scott.dept b where  a.deptno = b.deptno)

    等价

    select * from scott.emp a

    where not exists(select 1 from scott.dept b where  a.deptno = b.deptno)

    等价

    select * from scott.emp a left join scott.dept b

    on a.deptno = b.deptno

    where b.deptno is null

    标量子查询

    select ename, (select dname from scott.dept b where a.deptno = b.deptno)
    from scott.emp a
    where empno = 7499

    等价

    select ename, dname
    from scott.emp a left join scott.dept

    on a.deptno = b.deptno

    where empno = 7499

    表反复查询

    select ename from scott.emp

    where empno in (select max(empno) from scott.emp group by deptno)

    等价

    select ename  from (

    select ename ,

    empno,

    max(empno)over(partition by deptno) max_empno

     from scott.emp

    ) where empno=max_empno

    select * from (
    select count(*) from scott.emp where deptno=10),
    (
    select count(*) from scott.emp where deptno=20)

    等价

    select
    sum(case when deptno=10 then 1 end),
    sum(case when deptno=20 then 1 end)
    from scott.emp

    with可以改写sql中反复出现的查询体

    在一些特定场景中(子查询加层次查询,rownum等),sql的某种写法,会导致执行计划有问题,走的是cost较高的执行计划。

    所以需要sql改写,来让sql优化器能找出正确的执行计划。

    还有就是sql的逻辑,多次查询同一个表与查询一次就能获得结果集,那个效率高很明显赛。

    本人兼职卖核桃啊(家里的核桃)

    有兴趣可以微:15925660043

  • 相关阅读:
    Spring源码解析-AutowiredAnnotationBeanPostProcessor
    Spring源码解析-基于注解依赖注入
    Spring源码解析-事件
    Spring源码解析-AOP简单分析
    Spring源码解析-实例化bean对象
    Spring源码解析-配置文件的加载
    linux 条件判断式
    Assembly.LoadFrom加载程序集类型转换失败解决方法
    autodesk fbx sdk sample里面的工程无法调试解决方法
    Unity ---WidgetsUI CreateTileView Demo
  • 原文地址:https://www.cnblogs.com/muzisanshi/p/11842890.html
Copyright © 2011-2022 走看看