2009-04-27 4 views
1

Je dois rechercher des milliers de lignes par ID, mais les ID proviennent de l'extérieur de la base de données, donc je ne peux pas les obtenir d'autres tables:SQL: rechercher efficacement de nombreux ID provenant de l'extérieur de la base de données

SELECT * FROM some_table WHERE ID IN (SELECT KnownID dE some_other_table OU conditionquelconque )

y a-t-il quelque chose de mieux que cela:

SELECT * FROM some_table WHERE ID IN ('1001', '1002', '1003', ...)

Puis-je paramètrer une telle requête où le nombre de numéro d'identité est pas fixe? Ou est-ce que je finis par concaténer une grosse corde ensemble à chaque fois?

(j'utilise sqlite, d'ailleurs, mais je suis curieux de savoir d'autres bases de données aussi.)

+0

Ne pas concaténer une chaîne pour former une requête SQL. Utilisez une chaîne paramétrée. Évitez l'injection SQL. –

Répondre

4

Je voudrais créer une table temporaire avec les valeurs de variables et de faire un « select were in ».

+3

Si vous créez une table temporaire, vous pouvez également utiliser une jointure au lieu d'une clause IN. – SquareCog

+2

Je trouve bizarre de penser que ce serait plus rapide. À quoi ressemblerait la requête de création? Cela ne se traduirait-il pas par une très grosse chaîne de requête? – Jegschemesch

+0

select * FROM some_table s jointure temp_table t sur s.key = t.key –

1

(je suis en utilisant SQLite, d'ailleurs, mais je suis curieux de savoir d'autres db est trop.)

dans le serveur SQL, vous pourriez avoir un serveur lié puis suffit de faire une jonction entre les deux si c'est sur un serveur différent. Si elle est sur le même serveur, mais dans la base de données différente alors vous suffit de faire une jointure standard et ajouter le nombase à partir si les noms de table et schéma

0

quel format sont vos ID d'entrée arrivant à?

Sont-ils tapés manuellement par un utilisateur? dans un fichier texte/csv/xml? tiré d'un service? Si vous les obtenez en vrac, vous pouvez les insérer dans une table #temp puis les sélectionner par rapport à votre table #temp ... par ex.

//PSEUDO CODE 
foreach(string s in ListOfIdsFromFile) 
{ 
    //INSERT INTO #TempTable (ID) Values (ConvertToInt32(s)) 
} 

Puis

SELECT * FROM some_table a INNER JOIN #temp_table b ON a.ID = b.ID 
+0

Le coût de création de la temp annule-t-il le gain dans le select? – Jegschemesch

+1

Non, si vous faites une charge en vrac. Oui, si vous faites la boucle foreach ci-dessus. – SquareCog

0

SQL Server 2008 a une fonctionnalité appelée Tableau Valued Paramètres. See this article.

0

En SqlServer vous pouvez faire quelque chose comme ça

SELECT * FROM some_table WHERE ID IN (SELECT ID1 UNION ALL SELECT ID2 UNION ALL SELECT ID3 UNION ALL SELECT ID4 UNION ALL SELECT ID4) 
Questions connexes