所以我无法创建或编辑表格(我是具有只读权限的用户),我想要查找10,000个唯一ID。我不能将它们放在IN()语句中,因为oracle限制超过1000个项目。
是否可以从oracle中的DUAL表中选择整个列表?类似的东西:
select
'id123,id8923,id32983,id032098,id308230,id32983289'
from DUAL
答案 0 :(得分:3)
使用collection(它们不限于像IN
子句那样的1000个项目):
SELECT COLUMN_VALUE AS id
FROM TABLE(
SYS.ODCIVARCHAR2LIST(
'id123', 'id8923', 'id32983', 'id032098', 'id308230', 'id32983289'
)
)
SYS.ODCIVARCHAR2LIST
和SYS.ODCINUMBERLIST
是SYS
架构中提供的集合类型。
您可以直接将其加入到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条件
以逗号分隔的表达式列表不能超过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 ...