我爲擁有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