gpt4 book ai didi

sql - IN 子句 Oracle 中的值限制

转载 作者:行者123 更新时间:2023-12-04 18:30:35 24 4
gpt4 key购买 nike

我在一家拥有 DW - ETL 设置的公司工作。我需要编写一个查询,在 WHEN - IN 子句中查找超过 2500 个值,并在 WHERE - IN 子句中查找超过 1000 个值。基本上它看起来像下面这样:

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 子句(如其他 stackoverflow 中所建议的)线程):

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 分钟,并且作业被自动终止。所以我用谷歌搜索了我能找到的解决方案,似乎临时表可能是我正在寻找的解决方案,但老实说,我发现的所有例子都没有足够清楚地说明如何在表中包含我想要的值以及如何在我的原始查询中使用此表。甚至 ORACLE 文档也没有多大帮助。

另一个潜在问题是我的权限有限,而且我看到其他人提到在他们的公司中他们无权创建临时表。

我在研究中发现的一些信息:

ORACLE documentation

StackOverflow thread

[StackOverflow thread 2]

我发现的另一个解决方案是使用元组,如 THIS thread 中所述。 (我没有尝试过)因为另一位用户提到性能似乎受到很大影响。

任何关于如何使用临时表的指导,或者如果有人有其他方法来处理这个限制,我们将不胜感激。

最佳答案

创建一个全局临时表,因此不会创建撤消日志

CREATE GLOBAL TEMPORARY TABLE <table_name> (
<column_name> <column_data_type>,
<column_name> <column_data_type>,
<column_name> <column_data_type>)
ON COMMIT DELETE ROWS;

然后根据用户列表的到达方式将数据导入保存表,然后运行

select 'INSERT INTO global_temporary_table <column> values '
|| holding_table.column
||';'
FROM holding_table.column;

This gives you insert statements as output which you run to insert the data.

然后

SELECT  <some_column>
FROM <some_table>
WHERE <some_value> IN
(SELECT <some_column> from <global_temporary_table>

关于sql - IN 子句 Oracle 中的值限制,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35989248/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com