70 votes

Limite de la condition WHERE col IN (...)

J'utilise le code suivant :

SELECT * FROM table
WHERE Col IN (123,123,222,....)

Cependant, si je mets plus de ~3000 nombres dans le fichier IN SQL génère une erreur.

Quelqu'un sait-il s'il y a une limite de taille ou quelque chose de similaire ?!!

2 votes

Divisez les nombres de la clause IN en groupes suffisamment grands pour être traités, et asynchronisez-les tous en même temps.

0 votes

En réalité, n'utilisez pas in - IN est mauvais parce qu'il ne contient pas d'informations statistiques. Déclarez un type de table valorisé par les clés avec une clé primaire (elle contient alors des valeurs statistiques), insérez les valeurs dans cette table, joignez la table et cette table temporaire et l'optimiseur de requêtes peut faire son travail.

72voto

tekBlues Points 4346

Selon le moteur de base de données que vous utilisez, la longueur d'une instruction peut être limitée.

Le serveur SQL a une très grande limite :

http://msdn.microsoft.com/en-us/library/ms143432.aspx

ORACLE a une limite très facile à atteindre de l'autre côté.

Par conséquent, pour les clauses IN importantes, il est préférable de créer une table temporaire, d'insérer les valeurs et d'effectuer un JOIN. Cette méthode est également plus rapide.

5 votes

N'est pas correcte. La taille maximale d'une instruction SQL ou d'un lot est de 65K * (taille d'un paquet réseau qui est généralement de 4K) = plus de 250 Mb... msdn.microsoft.com/en-us/library/ms143432.aspx .

1 votes

Vous avez parfaitement raison, j'ai complété la réponse. BTW, dans ORACLE, la limite est TRES facile à atteindre !

0 votes

D'après le forum, ce n'est pas plus rapide dans le cas de SQLite : sqlite.1065341.n5.nabble.com/

36voto

Iain Hoult Points 1554

Il y a une limite, mais vous pouvez diviser vos valeurs en blocs séparés de in()

Select * 
From table 
Where Col IN (123,123,222,....)
or Col IN (456,878,888,....)

1 votes

IN() n'est pas SARGable. Vous feriez mieux de placer vos paramètres dans une table temporaire ou TVP et d'utiliser ensuite un INNER JOIN.

0 votes

Quelle est la limite de la requête ci-dessus ? Je veux dire combien de clauses IN je peux définir avec OR ?

1 votes

@MichaelK.Campbell pouvez-vous fournir des liens sur "IN() isn't SARGable" ? Et quelle en est l'importance ? La performance peut diminuer de 200% ?

13voto

Greg Points 11248

Paramétrer la requête et transmettre les identifiants à l'aide d'un fichier Paramètre valorisé dans le tableau .

Par exemple, définissez le type suivant :

CREATE TYPE IdTable AS TABLE (Id INT NOT NULL PRIMARY KEY)

Avec la procédure stockée suivante :

CREATE PROCEDURE sp__Procedure_Name
    @OrderIDs IdTable READONLY,
AS

    SELECT *
    FROM table
    WHERE Col IN (SELECT Id FROM @OrderIDs)

2 votes

Je ne sais pas pourquoi vous êtes downvoted parce que c'est une solution tout à fait valable. Bien que je changerais le Select Id FROM @OrderIDs à une jointure.

0 votes

Je sais qu'il s'agit d'une vieille réponse, mais savez-vous ce qu'il advient de vos OrderIds ? sont-ils conservés ? ou s'agit-il simplement d'un fichier temporaire ?

1 votes

@Jason @OrderIds est un paramètre à valeur de tableau. Il n'existe que pour la durée de la procédure.

5voto

DRapp Points 23901

Pourquoi ne pas faire un where DANS une sous-sélection...

Pré-requête dans une table temporaire ou autre...

CREATE TABLE SomeTempTable AS
    SELECT YourColumn
    FROM SomeTable
    WHERE UserPickedMultipleRecordsFromSomeListOrSomething

puis...

SELECT * FROM OtherTable
WHERE YourColumn IN ( SELECT YourColumn FROM SomeTempTable )

3 votes

Il est généralement préférable d'effectuer une jointure avec la table temporaire plutôt qu'une sous-sélection.

0 votes

Une clause d'existence ne serait-elle pas encore meilleure ?

4voto

AlexKuznetsov Points 9555

Selon votre version, vous pouvez utiliser un paramètre de tableau évalué en 2008, ou une approche décrite ici :

Tableaux et listes dans SQL Server 2005

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X