2011-01-18 15 views
41

¿Es posible incluir más de 1000 elementos en la cláusula SQL IN? Hemos estado teniendo problemas con nuestra base de datos Oracle que no puede manejarlo.SQL IN Cláusula 1000 elemento límite

SI sí, ¿cómo ponemos más de 1000 elementos en la cláusula SQL IN?

Si no, ¿qué más puedo hacer?

+5

posible duplicado de [SQL Oracle: Cómo utilizar más de 1000 artículos en el interior de una cláusula IN] (http://stackoverflow.com/questions/2401066/oracle-sql-how -to-use-more-than-1000-items-inside-an-in-clause) –

+2

Además de ser duplicado, quería hacerle saber que el límite de la cláusula in está ahí por algún motivo. Es una consulta extremadamente intensiva en recursos. Deberías hacer lo que @Jonathan ha mencionado. –

+1

posible duplicado de [Cómo poner más de 1000 valores en una cláusula Oracle IN] (http://stackoverflow.com/questions/400255/how-to-put-more-than-1000-values-into-an-oracle -en-cláusula) –

Respuesta

52

Debe transformar las cláusulas IN en las cláusulas INNER JOIN.

puede transformar una consulta como ésta

SELECT foo 
FROM bar 
WHERE bar.stuff IN 
     (SELECT stuff FROM asdf) 

en una consulta como esta otra.

SELECT b.foo 
FROM ( 
     SELECT DISTINCT stuff 
     FROM asdf) a 
JOIN bar b 
ON  b.stuff = a.stuff 

También va a obtener un gran rendimiento

+1

+1 para el insight – Jeune

70

Hay otra solución para esto que no se menciona en ninguna de las otras respuestas (u otras preguntas contestadas):

Cualquier de declaración como x in (1,2,3) se puede volver a escribir como (1,x) in ((1,1), (1,2), (1,3)) y el límite de 1000 elementos ya no se aplicará. Probé con un índice en x y explico que el plan todavía informa que Oracle está usando un predicado de acceso y escaneo de rango.

+0

+1 genial truco :) - probado con 10,001 elementos - el rendimiento parece sufrir aunque –

+0

No lo creo, genial truco – PoX

+0

Mi respuesta favorita! – TrojanName

0

Otra forma:

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 
--... 
) 
+0

Debería usar 'UNION ALL' en lugar de' UNION' y 'VALUES' constructor en lugar de ambos. – Hogan

2

Podemos tener más de un "IN" declaración para la misma variable.

Por ejemplo:

select val 
from table 
where val in (1,2,3,...) 
or 
val in (7,8,9,....)