问题描述
你好,
我面临一个问题,我需要在查询运算符中有1000多个值。
请建议一些方法。这里是给你的代码片段。
注意: RMID IN可以具有1000值。也曾尝试使用OR RMID IN ()-对于大于999的值。不确定性能。请帮忙
谢谢!
我面临一个问题,我需要在查询运算符中有1000多个值。
请建议一些方法。这里是给你的代码片段。
注意: RMID IN可以具有1000值。也曾尝试使用OR RMID IN ()-对于大于999的值。不确定性能。请帮忙
select count ( case when attandingtype = 1 then '1' end ) as existing_hp_count, count ( case when attandingtype = 2 then '1' end ) as new_hp_count, count ( case when attandingtype = 3 then '1' end ) as policy_count from worktracker where trunc (calldate) between add_months ( trunc (sysdate), -3 ) and trunc (sysdate) and rmid in ('1001', '1212');复制
谢谢!
专家解答
您的基本选择是:
Use a (temporary) table
首先将值加载到另一个表中,然后在您的in条件下使用temp表:
好处是你可以处理任意数量的值。缺点是你有一个额外的插入要做,减慢了过程。
Split the list into groups < 1,000
您现在可以处理任意数量的值,尽管您必须自己管理值拆分。
最大的缺点是优化器很难获得一个有大量或列表的好计划; 记住是许多OR的简写。
另外-假设您每次更改搜索的值数量-这可能会导致大量解析 (通常在列表中大的问题),这是一件坏事。而且由于SQL的文本相对较长,因此解析本身可能需要一段时间。
Use a multi-value IN list
您可以将许多值与IN列表进行比较; 这些值允许您比较1,000多个项目。
为此,请选择一个常量值,并在此列和列周围加上括号。然后检查这是否在一系列中:
(常量,值)
例如:
这与将值拆分为块 <1,000有类似的缺点; 您可能有很多缓慢的解析,并且可能有次优计划。
Pass the values as one string and split it in SQL
在这里,您将值作为一个字符串传递,然后使用您最喜欢的csv到行方法将其拆分。
例如:
这样做的好处是您可以使search_values成为bind变量。缺点是,如果您要搜索> 1,000值,则很容易达到varchar2限制 (32,767),因此您可能会遇到错误。
PS-在我看来,您正在将行转换为列-也就是枢轴。您可能想要在卷积的大小写表达式上使用pivot运算符:
https://blogs.oracle.com/sql/how-to-convert-rows-to-columns-and-back-again-with-sql-aka-pivot-and-unpivot
Use a (temporary) table
首先将值加载到另一个表中,然后在您的in条件下使用temp表:
insert into gtt ... select * from worktracker where rmid in ( select id from gtt );复制
好处是你可以处理任意数量的值。缺点是你有一个额外的插入要做,减慢了过程。
Split the list into groups < 1,000
select * from worktracker where rmid in ( 1, ..., 999 ) or rmid in ( 1001, ..., 1999 ) or ...复制
您现在可以处理任意数量的值,尽管您必须自己管理值拆分。
最大的缺点是优化器很难获得一个有大量或列表的好计划; 记住是许多OR的简写。
另外-假设您每次更改搜索的值数量-这可能会导致大量解析 (通常在列表中大的问题),这是一件坏事。而且由于SQL的文本相对较长,因此解析本身可能需要一段时间。
Use a multi-value IN list
您可以将许多值与IN列表进行比较; 这些值允许您比较1,000多个项目。
为此,请选择一个常量值,并在此列和列周围加上括号。然后检查这是否在一系列中:
(常量,值)
例如:
select * from worktracker where ( 1, rmid ) in ( ( 1, '1001' ), ( 1, '1212' ), ... )复制
这与将值拆分为块 <1,000有类似的缺点; 您可能有很多缓慢的解析,并且可能有次优计划。
Pass the values as one string and split it in SQL
在这里,您将值作为一个字符串传递,然后使用您最喜欢的csv到行方法将其拆分。
例如:
with vals as ( select '1001,1212' search_values from dual ), rws as ( select regexp_substr ( search_values, '[^,]+', 1, l ) v from vals, lateral ( select level l from dual connect by level <= length ( search_values ) - length ( replace ( search_values, ',' ) ) + 1 ) ) select * from worktracker where rmid in ( select * from rws );复制
这样做的好处是您可以使search_values成为bind变量。缺点是,如果您要搜索> 1,000值,则很容易达到varchar2限制 (32,767),因此您可能会遇到错误。
PS-在我看来,您正在将行转换为列-也就是枢轴。您可能想要在卷积的大小写表达式上使用pivot运算符:
https://blogs.oracle.com/sql/how-to-convert-rows-to-columns-and-back-again-with-sql-aka-pivot-and-unpivot
文章转载自ASKTOM,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。
评论
相关阅读
【纯干货】Oracle 19C RU 19.27 发布,如何快速升级和安装?
Lucifer三思而后行
747次阅读
2025-04-18 14:18:38
Oracle RAC 一键安装翻车?手把手教你如何排错!
Lucifer三思而后行
644次阅读
2025-04-15 17:24:06
Oracle数据库一键巡检并生成HTML结果,免费脚本速来下载!
陈举超
565次阅读
2025-04-20 10:07:02
【ORACLE】你以为的真的是你以为的么?--ORA-38104: Columns referenced in the ON Clause cannot be updated
DarkAthena
517次阅读
2025-04-22 00:13:51
【活动】分享你的压箱底干货文档,三篇解锁进阶奖励!
墨天轮编辑部
510次阅读
2025-04-17 17:02:24
【ORACLE】记录一些ORACLE的merge into语句的BUG
DarkAthena
496次阅读
2025-04-22 00:20:37
一页概览:Oracle GoldenGate
甲骨文云技术
478次阅读
2025-04-30 12:17:56
火焰图--分析复杂SQL执行计划的利器
听见风的声音
436次阅读
2025-04-17 09:30:30
3月“墨力原创作者计划”获奖名单公布
墨天轮编辑部
381次阅读
2025-04-15 14:48:05
OR+DBLINK的关联SQL优化思路
布衣
371次阅读
2025-05-05 19:28:36