2009-04-27 6 views
1

Ich muss Tausende von Zeilen nach ID nachschlagen, aber die IDs kommen von außerhalb der DB, so kann ich sie nicht von anderen Tabellen wie folgt erhalten:SQL: effizient viele IDs von außerhalb der DB nachschlagen

SELECT * FROM some_table WHERE ID IN ( SELECT KnownID VON some_other_table WHERE someCondition )

gibt es etwas besseres als das:

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

Kann ich parametrisieren eine solche Abfrage, wo die Anzahl der IDs ist nicht festgelegt? Oder schließe ich einfach jedes Mal eine große Saite aneinander?

(Ich verwende SQLite, btw, aber ich bin neugierig auf andere Datenbanken zu.)

+0

tun Sie eine Zeichenfolge nicht verketten zusammen eine SQL-Abfrage zu bilden. Verwenden Sie eine parametrisierte Zeichenfolge. Vermeiden Sie die SQL-Injektion. –

Antwort

4

ich eine temporäre Tabelle mit den variablen Werten erstellen würde und eine „select were in“ tun.

+3

Wenn Sie eine temporäre Tabelle erstellen, können Sie statt einer IN-Klausel auch eine Verknüpfung verwenden. – SquareCog

+2

Ich finde es merkwürdig zu denken, dass das schneller wäre. Wie würde die Erstellungsanfrage aussehen? Würde das nicht nur zu einem wirklich großen Abfragestring führen? – Jegschemesch

+0

select * FROM some_table s innere Join temp_table t auf s.key = t.key –

1

(Ich verwende SQLite, btw, aber ich bin auch über andere DBs neugierig.)

in SQL Server Sie einen verknüpften Server haben könnte und dann trete ein nur zwischen den beiden wenn es auf einem anderen Server ist. Wenn es auf dem gleichen Server, aber in anderer Datenbank dann würden Sie nur ein regelmäßige tun beizutreten und den DB-Namen in aus, wenn die Tabelle und Schemanamen

0

welches Format ist Ihre Eingabe-IDs der Ankunft in hinzufügen?

Werden sie manuell von einem Benutzer eingegeben? in einer Text/csv/xml-Datei? von einem Dienst abgerufen?

Wenn Sie sie in großen Mengen erhalten, können Sie sie in eine #temp-Tabelle einfügen und dann mit Ihrer #temp-Tabelle auswählen ... z.

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

Dann

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

Nicht die Kosten für die Schaffung der Temperatur den Gewinn in der Auswahl zunichte machen? – Jegschemesch

+1

Nein, wenn Sie eine Massenlast machen. Ja, wenn Sie die obige foreach-Schleife tatsächlich machen. – SquareCog

0

SQL Server 2008 verfügt über eine Funktion Tabelle Wertparameter genannt. See this article.

0

In SqlServer können Sie so etwas wie dieses

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) 
Verwandte Themen