【问题标题】:In Clause limit in oracle在 oracle 中的条款限制
【发布时间】:2018-02-05 16:11:25
【问题描述】:

我在 oracle 中动态形成一个查询来选择我将 id 作为输入的数据。我的查询如下

select * from temp where temp_id in ( :Id);

我的输入 id 以千计,所以我动态创建 in 子句,使我的最终查询如下

select * 
from temp
where temp_id in (a1,a2,a3,....a999) 
  or temp_id in (b1,b2,b3,....b999) or so on ....

我的问题是即使在那之后我得到了太多的值异常。 你能帮帮我吗?

【问题讨论】:

  • 我怀疑问题在于您试图分解您的 id 列表。此外,您可能希望涵盖没有 id 的情况。我通常使用where 1 = 2 or temp_id in (list of id's) etc 来做到这一点。
  • 您的数千个 ID 列表来自哪里?大概不是人类在屏幕上打字。在这种情况下,有机会做一些更聪明的事情,具体取决于您的架构。
  • @APC,我的 ID 是 Java 代码的一部分。我只是想让我的问题变得简单。
  • 那又怎样,一个字符串?一个数组?
  • 所以我们慢慢走向清晰。你如何调用SQL?它是否嵌入在 Java 层中?您是否有权创建数据库对象? “我只是想让我的问题变得简单”。下次考虑让你的问题完整:从长远来看,这对每个人来说都更容易。

标签: sql oracle oracle12c where-in


【解决方案1】:

一种方法是使用全局临时表:

CREATE GLOBAL TEMPORARY TABLE my_temp_table (
  id           NUMBER
)
ON COMMIT DELETE ROWS;

-- multiple INSERT INTO

select * from temp where temp_id in (SELECT id FROM my_temp_table);
COMMIT;

【讨论】:

    【解决方案2】:

    通过单个请求来完成

    select * from temp where id in (
        select a.letter||b.num from (
            select chr(rownum + 96) letter from dual connect by rownum < 3
        ) a 
        join (
            select rownum as num from dual connect by rownum < 1000
        ) b on 1=1
    );
    

    然后将“rownum

    【讨论】:

      猜你喜欢
      • 2011-11-10
      • 2013-06-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-02-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多