2010-04-15 5 views
1

Nous avons observé qu'il semble y avoir un nombre maximum d'identifiants/variables que l'on peut passer dans la clause IN de SQL en tant que valeurs séparées par des virgules. Pour éviter cela, nous stockons tous les identifiants dans une table et faisons un SELECT dans la clause IN. Cela signifie cependant des opérations de base de données supplémentaires pour stocker et récupérer les identifiants. Y a-t-il un autre moyen d'utiliser IN sans SELECT?Problème avec la clause IN dans SQL

Cordialement,

Sameer

+0

Quel serveur de base de données utilisez-vous? La réponse dépend de ces données. – Oded

+0

SQL Server 2007 et Oracle 10.2 – user179056

Répondre

2

En SQL Server 2008 vous pouvez déclarer une variable de table et de le transmettre à votre requête du client ou entre les procédures.

+0

La requête que j'ai est en HQL (langage de requête d'hibernation) intégrée dans le code j2ee. Cela doit également fonctionner avec Oracle 10.2. Je ne suis pas sûr que cela fonctionnera – user179056

2

Pour un nombre modeste de valeurs, je n'aurais pas pensé qu'un IN (SELECT ..) serait aussi cher sur n'importe quel rdbms.

Vous pourriez vous INNER JOIN table ID ou tout simplement briser la INs:

WHERE X IN (123,456 ...) 
    OR X IN (789,987 ...) 
    ... 
+0

J'ai déjà les variables. En utilisant votre exemple O WH X IN (123,456 ...) OU X IN (789,987 ...) 123,456 etc sont déjà dans les variables. Mais je ne peux pas énumérer tous les 12 000 d'entre eux car il y a une limitation à cela. J'essaie d'éviter de faire une autre sauvegarde de base de données pour une sauvegarde, puis une sélection – user179056

+0

12,000 ?! comment les transmettez-vous à une (des) clause (s)? –

0

Si vous le mettez dans able pourquoi vous utilisez toujours la clause in, pourquoi ne pas simplement se joindre à la table?

+0

Bien sûr, je pourrais le faire. L'objectif principal de ma question est de ne pas stocker les identifiants dans une table. J'ai déjà ces Ids dans les variables, mais puisqu'il y a cette limitation sur le nombre de variables que l'on peut passer dans une requête IN, je suis obligé de stocker les ids dans une table (hit de base de données) et retieve (using JOIN ou IN) un autre coup de db – user179056

2

avec Alex D'accord

Au lieu de

Select * From TableA Where ID IN (Select ID from IDTable) 

Utilisez

Select * From TableA 
INNER JOIN IDTable ON TableA.ID = IDTable.ID 

La jointure filtrera automatiquement les ID pour vous.

+0

http://explainextended.com/2009/06/16/in-vs-join-vs-exists/ – Quassnoi

+0

@Quassnoi Merci pour le lien vers l'article en profondeur Dans le cas OPs, ils stockent le IDs dans une table, donc je faisais juste remarquer que la façon JOIN serait équivalente si tout ce qu'ils font est le filtrage.En outre, 9 fois sur 10 si j'ai le choix, je vais utiliser la méthode de jointure pour la lisibilité et Il est également important de noter qu'un IN avec des valeurs séparées par des virgules est étendu à un groupe d'ORs lorsqu'il est réellement traité – Jeremy

+1

@Jemery: 'IN' avec des valeurs séparées par des virgules se développe en un' SCAN CONSTANT 'quand un certain seuil de Les valeurs sont considérées comme une table soumise à un set-bas normal opérations ed (jointure de hachage, jointure de fusion, etc.). – Quassnoi