2

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

是否可以从 oracle 的 DUAL 表中选择整个列表?就像是:

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

4 回答 4

6

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

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

SYS.ODCIVARCHAR2LIST并且SYS.ODCINUMBERLISTSYS模式中提供的集合类型。

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

SELECT y.*
FROM   your_table y
       INNER JOIN TABLE(
         SYS.ODCIVARCHAR2LIST(
           'id123', 'id8923', 'id32983', 'id032098', 'id308230', 'id32983289'
         )
       ) i
       ON (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'
                    );

您甚至可以将值作为绑定参数传递 - 请参阅我的答案here

于 2016-12-15T09:48:58.667 回答
2

Oracle 仍然不支持VALUES行构造函数,所以只有两个丑陋的解决方法:

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

表达式列表

以逗号分隔的表达式列表最多可以包含 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);
于 2016-12-15T07:16:03.360 回答
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 ...
于 2016-12-15T08:22:27.643 回答
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 列表。如果是这样,使用正则表达式生成这些选择语句很容易。只需将该列剪切'n'粘贴到支持正则表达式搜索和替换的编辑器中。

于 2016-12-15T07:16:22.810 回答