zoukankan      html  css  js  c++  java
  • oracle 使用 in 关键字查询且集合数量大小大于1000

    oracle 使用 in 关键字查询且集合数量大小大于1000

    Oracle MyBatis 提示:java.sql.SQLSyntaxErrorException: ORA-01795: 列表中的最大表达式数为 1000

    产生原因:oracle 使用 in 关键字查询且集合数量大小大于1000

    解决办法:

    第一种、将集合拆分,使用or 连接。
    select * from A where id in (1, 2, …, 1000) or id in (1001, …, 1999)
    第二种、将集合修改为查询语句
    select * from A where id in (select id from B)
    第三种、与 第二种 类似,使用 with as 语法,把条件封装成一个表
    with temp as (select * from B)
    select * from A where id in (select id from temp)

    关于SQL in查询(单次查询)和for循环查询(多次查询) 效率论证

    for查询:需要循环连接数据库,不仅占用大量连接池,而且多次的网络传输更是拖慢了总体的速度。(一般做过代码分析的都知道,程序其实并不会消耗太多时间,反而是网络请求消耗的时间较多)
    in查询
    首先 将多次连接直接降为一次,不仅节省连接池资源,且只进行一次网络传输。
    其次 就是大家在考虑的in查询的问题。不妨这么去想:对于数据库自身的优化来说,数据库本身完全可以将in查询转为多次查询,然后组合起来返回结果。-- 这类似于for查询,但是比程序中for查询节省了多次连接和多次网络传输。数据库自身起码会优化到这样,那也就不必担心其效率比for查询低了

    sql in 的替代方法

    表a 有20w条数据 有个主键自动增长的id ,
    这时,程序传过来4000多个id,中间用,隔开,我目前查询的写法是用in(4000个id),但这中方法太慢了 我想找个快的写法,能快速的查到数据

    通过函数先把id转换成表,然后用join的方法select a.* from 源表 a inner join (转换后的id表) b on a.id=b.id

  • 相关阅读:
    软件性能测试指标及其注意地方
    Oracle过程及函数的参数模式详解
    【转】Web Service单元测试工具实例介绍之SoapUI
    【转】如何读懂Oracle文档中的语法图
    浅谈session测试
    Cookie管理工具
    php 在linux 用file_exists() 函数判断 另外一台服务器映射过来的文件是否存在 总是返回false
    SecureCRT 设置字体跟颜色
    bootstrat 设置 select option 选项的值
    php 如何把中文写入json中 当json文件中还显示的是中文
  • 原文地址:https://www.cnblogs.com/h-c-g/p/15026682.html
Copyright © 2011-2022 走看看