大家好,项目中遇到个问题,就是 where c_custno in('1002','1003',‘1004'.....),里面可能会超过1000个,此时查询会报错,原因是ORACLE不支持in 里面大于1000个。
我现在想到了两个办法,一个是把 in 里面通过函数封装返回 一个table类型的,效果如 where c_custno in (select * from temptable);但是这个函数写法有问题,因为函数里面会出现substr()这种情况,substr 也不支持4000以上字符,所以没解决;
还有一个思路是 改造成where (c_custno in ('1002',.....) or c_custno in('1003','1004')) 这个也用到了substr 同样会出现问题。
大家有没有好的办法帮忙解决下,最好能够直接贴代码 

解决方案 »

  1.   

    把in后面的记录先放到一张临时表中,然后用 select * from table1 t1 where exist(select 1 from table2 where t1.c_custno = t2.c_custno)
      

  2.   

    一般这样做,把IN在条件拆分成不超过1000的多个IN,然后用union all合并结果集
      

  3.   

    in里边即便是可以放那么多,楼主不担心效率问题吗?
    为什么不想其他办法解决呢?
    IN适合于外表大而内表小的情况;
    EXISTS适合于外表小而内表大的情况。
      

  4.   

    可以考虑将查询sql拆分,分几次查询,然后合并
      

  5.   

    把in后面的记录先放到一张临时表table2中(仅仅有一个列),然后用 
    select t1.* from table1 t1 , table2 where t1.c_custno = t2.c_custno
      

  6.   

    不错个屁啊,临时表里的数据怎么来?还不是应用里插入来的,还是会超过1000,
    你以为是create tabel tmp as select * from  这样来?
    场景应该是这样的,
    客户可以勾选多达1000多个商品,可以选择可以不选择,然后查询这个1000多个商品的信息.你都不确定是哪1000多个商品ID,你凭什么建临时表?
    ---------------------------------
    个人还是赞同7楼的说法。从逻辑上来解决。
    或者分批查询,最后合并DATASET
      

  7.   

    select *
      from table(split('1002,1003,1004,.....,1009,',
                       ','))
    union all
    select *
      from table(split('2002,3003,4004,.....,5009,',
                       ','))
      

  8.   

    WITH table1 AS
    (
         SELECT '1001' AS c_custno, 'AAA' AS  bmnc,'張三A' AS xm,'1200' AS gz FROM dual
         union all
         SELECT '1002' AS c_custno, 'AAA' AS  bmnc,'李四A' AS xm,'1200' AS gz FROM dual
         union all
         SELECT '1003' AS c_custno, 'AAA' AS  bmnc,'王五A' AS xm,'1300' AS gz FROM dual
         union all
         SELECT '1004' AS c_custno, 'AAA' AS  bmnc,'趙六A' AS xm,'1100' AS gz FROM dual
         union all
         SELECT '1005' AS c_custno, 'BBB' AS  bmnc,'張三B' AS xm,'2500' AS gz FROM dual
         union all
         SELECT '1006' AS c_custno, 'BBB' AS  bmnc,'李四B' AS xm,'2300' AS gz FROM dual
         union all
         SELECT '1007' AS c_custno, 'BBB' AS  bmnc,'王五B' AS xm,'2400' AS gz FROM dual
         union all
         SELECT '1008' AS c_custno, 'BBB' AS  bmnc,'趙六B' AS xm,'2600' AS gz FROM dual   
         union all
         SELECT '2003' AS c_custno, 'CCC' AS  bmnc,'XXX' AS xm,'2600' AS gz FROM dual   
    )SELECT * FROM TABLE1 T1 WHERE EXISTS(SELECT RN FROM ((SELECT 1001+ROWNUM AS RN FROM DUAL CONNECT BY LEVEL<=1000/*1000上限自定义*/)) WHERE RN = T1.c_custno)
      

  9.   

    用 exit  将in  的条件写到里面去
      

  10.   


    可不可以把这些选择ID insert到某个表,然后用exists...