【发布时间】:2011-06-10 23:15:30
【问题描述】:
可以在 SQL IN 子句中放置超过 1000 个项目吗?我们一直遇到无法处理 Oracle 数据库的问题。
如果是,我们如何在 SQL IN 子句中放入 1000 多个项目?
如果没有,我还能做什么?
【问题讨论】:
-
除了重复之外,我想让您知道存在 in 子句限制是有原因的。它是一个资源极其密集的查询。你应该按照@Jonathan 所说的去做。
可以在 SQL IN 子句中放置超过 1000 个项目吗?我们一直遇到无法处理 Oracle 数据库的问题。
如果是,我们如何在 SQL IN 子句中放入 1000 多个项目?
如果没有,我还能做什么?
【问题讨论】:
如果你没有创建临时表的奢侈,你可以使用 WITH 子句来模拟它
with t as (
select 1 val from dual
union all select 2 from dual
union all select 3 from dual
...
union all select 5001 from dual
union all select 5002 from dual
)
select *
from mytable
where col1 in (select val from t)
显然,您也可以将 mytable 加入 t
我最喜欢 Gordy 的回答,只是展示了另一种方式。
【讨论】:
对于同一个变量,我们可以有多个“IN”语句。
例如:
select val
from table
where val in (1,2,3,...)
or
val in (7,8,9,....)
【讨论】:
另一种方式:
SELECT COL1, COL2, COL3 FROM YOUR_TABLE
WHERE 1=1
AND COL2 IN (
SELECT VAL1 as FAKE FROM DUAL
UNION
SELECT VAL2 as FAKE FROM DUAL
UNION
SELECT VAL3 as FAKE FROM DUAL
--...
)
【讨论】:
UNION ALL 而不是UNION 和VALUES 构造函数而不是两者。
VALUES表构造函数
values 列为表构造函数。你能分享文档的链接吗?
values。
还有另一种解决方法,在任何其他答案(或其他已回答的问题)中都没有提到:
任何像x in (1,2,3) 这样的in 语句都可以重写为(1,x) in ((1,1), (1,2), (1,3)),并且1000 个元素的限制将不再适用。我在x 上使用索引进行了测试,解释计划仍然报告Oracle 正在使用访问谓词和范围扫描。
【讨论】:
您应该将 IN 子句转换为 INNER JOIN 子句。
您可以像这样转换查询
SELECT foo
FROM bar
WHERE bar.stuff IN
(SELECT stuff FROM asdf)
在另一个类似的查询中。
SELECT b.foo
FROM (
SELECT DISTINCT stuff
FROM asdf ) a
JOIN bar b
ON b.stuff = a.stuff
你也会获得很多的表现
【讨论】: