我为拥有DW-ETL设置的公司工作。我需要编写一个查询,在WHEN - IN
子句中查找超过2500+个值,并且在WHERE - IN
子句中查找超过1000+个值。基本上,它看起来像下面这样:IN子句中的值限制Oracle
SELECT
,user_id
,CASE WHEN user_id IN ('user_n', +2500 user_[n+1]) THEN 1
ELSE 0
,item_id
FROM user_table
WHERE item_id IN ('item_n', +1000 item_[n+1]);
正如你可能已经知道PL/SQL允许在IN
条款最多1000个值的,所以我尝试添加OR - IN
条款(如在其他计算器线程建议):
SELECT
,user_id
,CASE WHEN user_id IN ('user_n', +999 user_[n+1])
OR user_id IN ('user_n', +999 user_[n+1])
OR user_id IN ('user_n', +999 user_[n+1]) THEN 1
ELSE 0 END AS user_group
,item_id
FROM user_table
WHERE item_id IN ('item_n', +999 item_[n+1])
OR item_id IN ('item_n', +999 item_[n+1]);
注:我知道数学是在上面的例子是错误的,但你明白了吧
的问题是,查询有120分钟的最大执行时间和作业将自动为k illed。所以我搜索了一下我能找到的解决方案,看起来临时表可能是我正在寻找的解决方案,但是诚实地说,我发现没有任何例子足够清楚如何在表中包含我想要的值,以及在我原来的查询中使用这个表。甚至连ORACLE文档都没有多大帮助。
另一个潜在的问题是我的权利有限,而且我看到其他人提到在他们的公司他们没有创建临时表的权利。
一些我在我的研究中发现的信息的:
另一种解决方案,我发现用元组代替,如THIS thread提到的(这是我的避风港没有尝试过),因为另一个用户提到的性能似乎受到了很大的影响。
任何有关如何使用临时表的指导或任何人有另一种处理此限制的方法都将不胜感激。
哪里是你的'IN'子句的值? –
您应该将所有这些值存储在临时表(user_n,item_n)中并使用IN到 – sagi
@TomH这些值是由另一个部门“随机”选择的。我说随机,因为只知道为什么这些值是他们需要的,但我可以向你保证没有任何模式,例如BETWEEN不会帮助 – nachomasterCR