精华内容
下载资源
问答
  • SQL中(not)in替代方法(2013-07-29 10:21:22)标签:sqlinjoinunion替代it分类:SQL需求描述:假设在一个平台上面有60个报表,如果有用户访问或者使用某一个报表那么就会在数据库中添加一条记录保存了被访问的报表...

    SQL中(not)in的替代方法

    (2013-07-29 10:21:22)

    标签:

    sql

    in

    join

    union

    替代

    it

    分类:

    SQL

    需求描述:假设在一个平台上面有60个报表,如果有用户访问或者使用某一个报表那么就会在数据库中添加一条记录保存了被访问的报表名称是使用时间,现在需要找出在某给定时间里面没有被使用的报表的列表

    分析:由于未被使用的报表是没有被添加到数据库当中的,所以通过建立的记录数据库是找不到所有的报表的信息的,所以解决方法采用的是在数据库中另外新建一个表用来存储所有的报表的名称,把所有的报表添加进去之后就进行查询操作,当然首先想到的是使用not

    in语句,将所有表中未被访问的表抽取出来,原理上来说是ok的,但是在oracle

    SQL里面却报错,也不能说报错,只是结果不是语气的,整个in和not

    in似乎根本就没有用,于是猜想oracle把这个费时的用法给摒弃了,于是开始了寻求替代的方法查找之旅~~找到了很多替代的方法,也都尝试过,结果不正确,于是一直在查找~~~到最后的结果是,知道了很多替代的妙法,也发现根本原因并不是in和not

    in的问题,而是建表的时候的空格或者是tab键处理不当导致匹配的时候无法配对成功,然后删去一些空格所有的方法就都ok了~~~好像是费尽心血但是却发现找错误找错了方向,之前也有类似的经历,在显示报表的时候有粗线,一直以为是格式的问题,修改折磨了好久,结果一个不小心却发现原来是分辨率的问题~~岂不哀哉~~所以,心想,好吧,就算找错了方向也应当让这次错误之旅有所价值,于是记下寻到的in和not

    in的替代之法,希望来日有所用处~~~

    (1)in和not in浅析

    (not)in从一个表中返回另一个表中有(无)的结果,因为这样的操作是针对两个表的,在执行的时候需要额外花费很多的时间~总之在较大型的企业级解决方案里面是不推荐的

    (2)exists和not exists

    一般来说能够用in和not in的就是可以用exists和not

    exists替代的,他们的功能基本是一致的,不过exists的性能会比in好很多,在用法上二者有些小区别,例如:

    select a.c1 from a where c1 not in(select b.c3 from b where

    ....)等价于

    select a.c1 from a where not exists (select b.c3 from b where

    ...)

    是从某表a中选出不在括号结果中的列c1,in的小差别类似,不赘述~

    (3)利用union操作

    首先将所有的名称和已经被访问过的表的名称union到一个表中,然后使用函数count一下,取count结果为1的就是未被访问的,因为被访问过的表的count值都会大于等于2,这个是可行的~

    select c1,count(c1)

    from

    (select c1

    from a

    union (all)

    select c3

    from b

    where...)

    group by c1

    having count(c1)=1

    --order by c1 asc

    (4)利用join操作

    具体来说利用left join操作,将所有名称表和被访问过的表进行left

    join,这样未被访问表的后一项就会是null,然后根据null来挑选出未被访问过的表的名称,基于left

    join的基本功能,这样也是可行的~~~

    select c1

    from a

    left join

    (select c3

    from b

    where ...)

    on a.c1 = b.c3

    where c3 = null

    --order by c1 asc

    分享:

    a4c26d1e5885305701be709a3d33442f.png喜欢

    0

    a4c26d1e5885305701be709a3d33442f.png赠金笔

    加载中,请稍候......

    评论加载中,请稍候...

    发评论

    登录名: 密码: 找回密码 注册记住登录状态

    昵   称:

    评论并转载此博文

    a4c26d1e5885305701be709a3d33442f.png

    发评论

    以上网友发言只代表其个人观点,不代表新浪网的观点或立场。

    展开全文
  • ORACLENOT IN替代

    2010-11-09 13:54:00
    ORACLENOT IN替代
    典型的查询方式为:
    select emp_no from hr_basicinfo where emp_no 
    where emp_no
     not in
     (select emp_no from emp);

    如果 emp 很大的话,速度可能会很慢,因为ORACLE会在 emp 上执行一个时间密集型的全表扫描。

    oracle 中not in 效率不高

    一:
    使用外部连接
    SELECT DISTINCT C.TITLE
    FROM BOOKSHELF_CHECKOUT B RIGHT OUTER JOIN BOOKSHELF C
        ON B.TITLE = C.TITLE
    WHERE B.TITLE IS NULL
    ORDER BY C.TITLE ;
    SELECT  c.emp_no,c.emp_name,c.dept_no,c.hired_date,c.status
    FROM emp B RIGHT OUTER JOIN  hr_basicinfo C
        ON B.emp_no = C.emp_no
    WHERE B.emp_no IS NULL
    ORDER BY C.emp_no
    优化后的程序可以使用连接列上的索引。
    WHERE B.emp_no IS NULL
    表示不出现在 emp 中的 emp_no 列 (ORACLE作为NULL列返回,可参考外部连接方面的内容)
    展开全文
  • ORACLENOT IN替代

    千次阅读 2012-10-03 10:43:56
    ORACLENOT IN替代 http://myjcwy.iteye.com/blog/553563

    ORACLE中NOT IN 的替代

    http://myjcwy.iteye.com/blog/553563

    展开全文
  • sql语句优化之用EXISTS替代IN、用NOT EXISTS替代NOT IN的语句
  • oracle中代替innot in 高效方法

    万次阅读 2018-09-07 10:51:40
    因此如果简单提高效率可以用exist代替in进行操作,当然换成表连接可以更快地提高效率,具体是用left join代替not in 和not exist,用inner join 代替in和exist,这样可以大大提高效率。具体例子如下: A、NOT...

    在oracle中效率排行:表连接>exist>not exist>in>not in;
    因此如果简单提高效率可以用exist代替in进行操作,当然换成表连接可以更快地提高效率,具体是用left join代替not in 和not exist,用inner join 代替in和exist,这样可以大大提高效率。具体例子如下:
    A、NOT IN、NOT EXISTS的相关子查询可以改用LEFT JOIN代替写法。
    比如: 

    SELECT PUB_NAME 

    FROM PUBLISHERS 

    WHERE PUB_ID NOT IN (SELECT PUB_ID FROM TITLES WHERE TYPE = 'BUSINESS')

    可以改写成: 

    SELECT A.PUB_NAME 

    FROM PUBLISHERS A LEFT JOIN TITLES B ON B.TYPE = 'BUSINESS' AND A.PUB_ID=B. PUB_ID

    WHERE B.PUB_ID IS NULL
    (2)
    SELECT TITLE 

    FROM TITLES 

    WHERE NOT EXISTS (SELECT TITLE_ID FROM SALES WHERE TITLE_ID = TITLES.TITLE_ID)

    可以改写成:
    SELECT TITLE 

    FROM TITLES LEFT JOIN SALES ON SALES.TITLE_ID = TITLES.TITLE_ID

    WHERE SALES.TITLE_ID IS NULL 

    B、 如果保证子查询没有重复 ,IN、EXISTS的相关子查询可以用INNER JOIN 代替。

    比如:
    SELECT PUB_NAME 

    FROM PUBLISHERS 

    WHERE PUB_ID IN (SELECT PUB_ID FROM TITLES 

    WHERE TYPE = 'BUSINESS') 

    可以改写成:
    SELECT DISTINCT A.PUB_NAME 

    FROM PUBLISHERS A INNER JOIN TITLES B ON B.TYPE = 'BUSINESS' AND A.PUB_ID=B. PUB_ID

     

    有两个简单例子,以说明 “exists”和“in”的效率问题

    1) select * from T1 where exists(select * from T2 where T1.a=T2.a) ;

        T1数据量小而T2数据量非常大时,T1<<T2 时,1) 的查询效率高。

    2) select * from T1 where T1.a in (select T2.a from T2) ;

         T1数据量非常大而T2数据量小时,T1>>T2 时,2) 的查询效率高。

    exists 用法:

    1)句中的“select * from T2 where T1.a=T2.a” 相当于一个关联表查询,

         相当于“select * from T1,T2  where T1.a=T2.a”;

        “exists(xxx)”它只在乎括号里的数据能不能查找出来,是否存在这样的记录,如果存在,这1)句的where 条件成立。

    in的用法:

    2)句中的“select * from T1 where T1.a in (select T2.a from T2) ”,这里的“in”后面括号里的语句搜索出来的字段的内容一定要相对应,一般来说,T1和T2这两个表的a字段表达的意义应该是一样的,否则这样查没什么意义。

    展开全文
  • 今天在写一条sql查询语句,其需要从一个表A中返回所有A不再表B中的结果集,当然,这种实现最方便的方法就是用NOT IN。 如:select a.* from a where a.id not in (select id from b where…..) 我们大家都...
  • Not IN问题 Exists,not Exists,innot in 例如: DELETE FROM YSHA WHERE NOT EXISTS(SELECT 1 FROM YSHB B WHERE YSHA.code=b.code ) 等同于 DELETE A FROM YSHA A LEFT JOIN YSHB B ON A.code...
  • oraclenot in

    2007-04-05 15:29:00
    oraclenot in Table title
  • 首先,在oracle中效率排行:...因此如果简单提高效率可以用exist代替in进行操作,当然换成表连接可以更快地提高效率,具体是用left join代替not in 和not exist,用inner join 代替in和exist,这样可以大大提...
  • :用EXISTS替代IN、用NOT EXISTS替代NOT IN: 在许多基于基础表的查询中,为了满足一个条件,往往需要对另一个表进行联接.在这种情况下, 使用EXISTS(或NOT EXISTS)通常将提高查询的效率. 在子查询中,NOT IN子句将...
  • oraclenot in的优化

    千次阅读 2016-07-30 10:23:15
    ORACLENOT IN替代 http://myjcwy.iteye.com/blog/553563 典型的查询方式为:  SELECT TITLE FROM BOOKSHELF WHERE TITLE NOT IN   (SELECT TITLE FROM BOOKSHELF_CHECKOUT)  ORDER BY TITLE; ...
  • oracle 用EXISTS替代IN

    2009-12-09 11:22:41
    1.用EXISTS替代IN 在许多基于基础表的查询中,为了满足一个条件,往往需要对另一个表进行联接.在这种情况下,使用EXISTS(或NOTEXISTS)通常将提高查询的效率. 低效: ...
  • 有些时候进行查询的时候啊,一个字段的in、 not in根本不能满足要求,非常需要类似多个字段的innot in,但是很多数据库不支持多个字段的in、 not in (DB2是支持的),估计也让不少朋友们郁闷吧!不过没关系,我...
  • 首先,在oracle中效率排行:表连接&...not in,而且使用in查询会有查询条件数量不能超过1000的限制;因此如果简单提高效率可以用exist代替in进行操作,当然换成表连接可以更快地提高效率,具体是用...
  • oracle 10g exists&not exists用法详解-实际开发案例
  • minus语法:A minus B只去除A跟B的交集部分,将A剩余自己独有的部分输出显示。(1)minus语法(2)... 与minus功能相同的有(not innot exist)关键字 例子(1)原表(2)例子1:部分相同(3)例子2:完全相同 ...
  • ORACLE触发器详解

    万次阅读 多人点赞 2012-09-27 10:00:56
    它就是ORACLE 8专门为进行视图操作的一种处理方法。   8.1.3 系统触发器 ORACLE 8i 提供了第三种类型的触发器叫系统触发器。它可以在ORACLE数据库系统的事件中进行触发,如ORACLE系统的启动与关闭等。 ...
  • exists,not exists,join ,in 条件等。   注:这个用了几次发现应该注意的问题:   1、为什么没有分类排序?排序总是1等  可能是排序的 group by变量没有设置正确,没有初始赋值 set @mid=''语句,变量设置在判断...
  • 想在Oracle中用一条SQL语句直接进行Insert/Update的操作。 说明: 在进行SQL语句编写时,我们经常会遇到大量的同时进行Insert/Update的语句 ,也就是说当存在记录时,就更新(Update),不存在数据时,就插入(Insert)...
  • 允许导出到多个小文件中,以替代单一的大文件。   其它的 2Gb 导出问题 Oracle 允许区( extent )的尺寸最大为 2Gb 。但是不幸的是,在大多数的 Oracle 发行版中 Export 都存在这样一个问题,当你 Export...
  • Exists用于只能用于子查询,可以替代in,若匹配到结果,则退出内部 查询,并将条件标志为true,传回全部结果资料,in不管匹配到匹配不到都 全部匹配完毕,使用exists可以将子查询结果定为常量,不影响查询效果, ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 24,014
精华内容 9,605
关键字:

innotoracle的替代方法