8wDlpd.png
8wDFp9.png
8wDEOx.png
8wDMfH.png
8wDKte.png

SQL IN 子句 1000 项限制

CraftyB 2月前

120 0

是否可以在 SQL IN 子句中放入超过 1000 个项目?我们的 Oracle 数据库一直无法处理这个问题。如果可以,我们如何在 SQL IN 子句中放入超过 1000 个项目?

可以在 SQL IN 子句中放入超过 1000 个项目吗?我们的 Oracle 数据库一直无法处理这个问题。

如果是,我们如何在 SQL IN 子句中放入超过 1000 个项目?

如果没有的话我还能做什么?

帖子版权声明 1、本帖标题:SQL IN 子句 1000 项限制
    本站网址:http://xjnalaquan.com/
2、本网站的资源部分来源于网络,如有侵权,请联系站长进行删除处理。
3、会员发帖仅代表会员个人观点,并不代表本站赞同其观点和对其真实性负责。
4、本站一律禁止以任何方式发布或转载任何违法的相关信息,访客发现请向站长举报
5、站长邮箱:yeweds@126.com 除非注明,本帖由CraftyB在本站《list》版块原创发布, 转载请注明出处!
最新回复 (0)
  • 除了重复之外,我想让你知道 in 子句限制的存在是有原因的。这是一个极其耗费资源的查询。你应该按照@Jonathan 提到的去做。

  • 您应该将 IN 子句转换为 INNER JOIN 子句。

    您可以转换如下查询

    SELECT  foo   
    FROM    bar   
    WHERE bar.stuff IN  
           (SELECT  stuff FROM asdf)
    

    在类似这样的查询中。

    SELECT  b.foo 
    FROM    ( 
            SELECT  DISTINCT stuff 
            FROM    asdf ) a 
    JOIN    bar b 
    ON      b.stuff = a.stuff
    

    你也会获得很多表现

  • 还有另一种解决方法,其他答案(或其他已回答的问题)中均未提及:

    任何 in 语句都 x in (1,2,3) 可以重写为, (1,x) in ((1,1), (1,2), (1,3)) 并且 1000 个元素的限制将不再适用。我已经使用索引进行了测试 x ,解释计划仍然报告 Oracle 正在使用访问谓词和范围扫描。

  • T J 2月前 0 只看Ta
    引用 5

    +1 个很酷的技巧 :) - 用 10,001 个元素进行了测试 - 但性能似乎受到影响

  • @Nitish 我猜对元组的支持是后来才出现的,那时开发人员已经了解了 ZOI 原则

  • @JeffreyKemp Oracle 似乎将元组样式的 in 子句限制为 70,000,但仍然比常规的 in 子句限制要好。

  • 也许您的意思是 65535,@JeffreyKemp。asktom.oracle.com/pls/apex/…,最后一条评论。\'我测试过,元组列表的限制是 65,535 - 就像您在示例中所暗示的那样。与您的 Oracle 版本相同,12.2.0.1..... 仅通过将原子元素括在括号中将其变成 1 元组是行不通的;元组必须是 n 元组,且 n >= 2。....并且 Oracle 对此类复合条件的组件条件有 2^16 - 1 = 65,535 个硬性限制 - 无论这些条件是什么\'

  • 对于同一个变量,我们可以有多个 \'IN\' 语句。

    例如:

    select val
     from table
    where val in (1,2,3,...)
    or
    val in (7,8,9,....)
    
  • 如果您没有创建临时表的能力,则可以使用 WITH 子句来模拟它

    with t as (
      select 1 val from dual 
      union all select 2 from dual
      union all select 3 from dual
        ...
      union all select 5001 from dual
      union all select 5002 from dual
    )
    select * 
      from mytable
     where col1 in (select val from t)
    

    显然,你也可以将 mytable 加入到

    我最喜欢 Gordy 的回答,只是展示了另一种方式。

  • damd 2月前 0 只看Ta
    引用 11

    收藏品可以有超过 1000 个项目。

    创建集合数据类型:

    CREATE TYPE number_list IS TABLE OF NUMBER;
    

    然后你可以使用 MEMBER OF 运算符:

    SELECT *
    FROM   table_name
    WHERE  id MEMBER OF number_list(1,2,3,4 /*,...*/ ,7999,8000)
    

    或者 IN 使用表集合表达式:

    SELECT *
    FROM   table_name
    WHERE  id IN (
                  SELECT COLUMN_VALUE
                  FROM   TABLE(number_list(1,2,3,4 /*,...*/ ,7999,8000))
                 )
    

    或者,某些语言(例如 Java—— 示例 )可以使用绑定变量将数组作为 SQL 集合传递:

    SELECT *
    FROM   table_name
    WHERE  id MEMBER OF :your_array
    
  • 另一种方法:

    SELECT COL1, COL2, COL3 FROM YOUR_TABLE
    WHERE 1=1
    AND COL2 IN (
    SELECT VAL1 as FAKE FROM DUAL
    UNION
    SELECT VAL2 as FAKE FROM DUAL
    UNION
    SELECT VAL3 as FAKE FROM DUAL
    --...
    )
    
  • @Hogan Oracle 直到 21c 才将值列为表构造函数。您能分享文档链接吗?

  • @hogan 是的,这个答案是关于这个的,但是你的评论建议再次使用5年前和半年前的价值观。

  • @astentx——答案仍然很糟糕——应该使用 UNION ALL 而不是 UNION

返回
作者最近主题: