2009-03-10 11 views
0

Ich versuche, Mitarbeiter basierend auf ihrem Code und Abteilung zu suchen.Problem mit "IN" bei der Ausführung der Abfrage

Ich löste eine Abfrage mit IN-Operator, der 1200 Mitarbeitercodes hat. Als ich die Abfrage ausgeführt habe, habe ich eine Ausnahme bekommen ("Maximum 1000 records in IN erlaubt").

Kann mir jemand mit diesem Problem helfen.

+0

Bitte senden Sie Ihren SQL-Code –

+0

Möchten Sie wirklich eine IN-Anweisung mit 1200 Einträgen sehen? – kdgregory

+0

D'oh Ihr Kommentar hat mir klar gemacht, dass ich das Falsche gefragt habe ;-) Danke. – RuudKok

Antwort

1

Viele DBMS erlauben nicht eine Abfrage wie

SELECT * FROM table WHERE col IN (...) 

mit mehr als 1.000 Werte in der Liste. Vielleicht ist es möglich, sie zu zerlegen Stücke von weniger als 1.000 Werte mit:

SELECT * FROM table WHERE col IN (...) OR col IN (...) 

oder

SELECT * FROM table WHERE col IN (...) 
UNION 
SELECT * FROM table WHERE col IN (...) 

(Obwohl es würde keinen Sinn machen und es ist unwahrscheinlich zu arbeiten).

Andernfalls sollten Sie Ihre Werte in einer temporären Tabelle speichern und stattdessen ein JOIN verwenden. Woher bekommst du deine 1.200 Codes - sie befinden sich nicht zufällig in derselben Datenbank? :)

+0

ist es gut, viele IN-Abfrage verwenden. Wird die Leistung nicht beeinträchtigt –

+0

Hängt davon ab, wie intelligent Ihr DBMS ist. Die Verwendung einer temporären Tabelle mit indizierten Spalten ist wahrscheinlich schneller. Ehrlich gesagt, ist es vielleicht eine gute Idee, Ihre Tische neu zu gestalten! –

5

Das Hochladen dieser Datensätze in eine temporäre Tabelle und das Verwenden einer Verknüpfung wird mit ziemlicher Sicherheit viel schneller sein. So wie es ist, muss der Parser einen riesigen Bedingungsbaum für das IN erstellen.

Hinweis: Ich weiß nicht, ob MYSQL die temporären Tabellen der Transaktionsebene von Oracle oder SQLServer unterstützt, aber auch eine "echte" Tabelle sollte schneller sein, insbesondere wenn sie einmal erstellt und wiederverwendet wird. Es gibt natürlich viele Variablen, wie zum Beispiel die Fähigkeit, Einsätze in diese Tabelle zu schreiben, die Kosten für das Schreiben von Transaktionsprotokollen, & c.

Noch einmal Ihre Frage: Woher bekommen Sie diese Mitarbeitercodes? Kannst du sie von einem Tisch bekommen oder mitmachen?

+0

wird Prozeduraufruf gespeichert zu erhalten die Mitarbeitercodes aus anderen Datenbanken (Tabelle). –

0

erstellen (temporäre) Tabelle, die Ihre Mitarbeiter Codes enthalten, füllen Sie es, und Abfrage wie folgt aus:

SELECT * 
FROM mytable 
WHERE empcode IN (SELECT mycode FROM temptable) 
+0

wird dies schneller.Coz Ich habe bereits gespeicherte Prozedur, um die Mitarbeitercodes aus anderen Tabelle –

0

Erstellen Sie eine speicherinterne temporäre Tabelle (nur kleine Tabellen), füllen Sie die Ergebnisse der gespeicherten Prozedur auf. Führen Sie eine Auswahl mit einem Join in der temporären Tabelle durch. Löschen Sie die temporäre Tabelle.

CREATE TEMPORARY TABLE ENGINE=MEMORY tmp AS 
    SELECT code FROM employee; // in-memory temporary table (small tables) 

SELECT col1, col2 FROM table 
    INNER JOIN tmp ON table.code = tmp.code; // join faster than subquery 

DROP TEMPORARY TABLE tmp; // cleanup temporary table 
Verwandte Themen