如何从oracle SQL中的双重选择10,000个唯一ID的列表

时间:2016-12-15 01:00:48

标签: sql oracle dual-table

所以我无法创建或编辑表格(我是具有只读权限的用户),我想要查找10,000个唯一ID。我不能将它们放在IN()语句中,因为oracle限制超过1000个项目。

是否可以从oracle中的DUAL表中选择整个列表?类似的东西:

select  
'id123,id8923,id32983,id032098,id308230,id32983289'  
from DUAL

4 个答案:

答案 0 :(得分:3)

使用collection(它们不限于像IN子句那样的1000个项目):

SELECT COLUMN_VALUE AS id
FROM   TABLE(
         SYS.ODCIVARCHAR2LIST(
           'id123', 'id8923', 'id32983', 'id032098', 'id308230', 'id32983289'
         )
       )

SYS.ODCIVARCHAR2LISTSYS.ODCINUMBERLISTSYS架构中提供的集合类型。

您可以直接将其加入到SELECT的任何一个表中,而无需使用DUAL表:

SELECT y.*
FROM   your_table y,
       TABLE(
         SYS.ODCIVARCHAR2LIST(
           'id123', 'id8923', 'id32983', 'id032098', 'id308230', 'id32983289'
         )
       ) i
WHERE  y.id = i.COLUMN_VALUE;

如果您可以创建一个集合类型,那么您甚至不需要TABLE表达式,并且可以使用WHERE运算符直接在MEMBER OF子句中使用它:

CREATE OR REPLACE TYPE stringlist IS TABLE OF VARCHAR2(200);
/

SELECT *
FROM   yourtable
WHERE  id MEMBER OF stringlist(
                      'id123', 'id8923', 'id32983', 'id032098', 'id308230', 'id32983289'
                    );

您甚至可以将值作为绑定参数传递 - 请参阅my answer here

答案 1 :(得分:2)

Oracle仍然不支持VALUES行构造函数,因此只有两个难看的解决方法:

1000项限制不适用于多列IN条件

Expression Lists

  

以逗号分隔的表达式列表不能超过1000个   表达式。逗号分隔的表达式列表可以包含   任意数量的集合,但每组可以包含不超过1000   表达式。

所以你可以这样做:

where (1,id) in ( (1,'id123'),
                  (1,'id8923'),
                  (1,'id32983'), 
                  (1,'id032098'), .... )

或使用丑陋的UNION ALL:

with idlist (xid) as (
  select 'id123' from dual union all 
  select 'id8923' from dual union all 
  .....
  select 'id32983' from dual 
)
select ...
from some_table
where id in (select xid from idlist);

答案 2 :(得分:0)

一个解决方案是WITH子句:

with ids as (
   select 'id123' as uid from dual union all
   select 'id8923' as uid from dual union all
   select 'id32983' as uid from dual union all
   select 'id032098' as uid from dual union all
   select 'id308230' as uid from dual union all
   select 'id32983289' as uid from dual 
)
select *
from ids
     join your_table yt
     on yt.id = ids.uid  

这可能看起来像是一件苦差事,但可能是你在电子表格中有你的UID列表或其他什么。如果是这样,可以使用正则表达式生成那些select语句。只需将列粘贴到支持正则表达式搜索和替换的编辑器中即可。

答案 3 :(得分:0)

另一种解决方法

select  *

from    t

where   id in ('id1','id2','id3',...,'id1000')
     or id in ('id1001','id1002','id1003',...,'id2000')
     or id in ('id2001','id2002','id2003',...,'id3000')
     or ...