2009-04-20 8 views

Antwort

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

und wenn Ihre bekannten IDs aus einer anderen Tabelle

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

Für einen festen Satz von IDs kommen, können Sie tun:

SELECT * FROM some_table WHERE id IN (1001, 2002, 3003); 

Für einen Satz das ändert sich jedes Mal, möchten Sie möglicherweise eine Tabelle erstellen, um sie zu halten und dann abfragen:

SELECT * FROM some_table WHERE id IN 
    (SELECT id FROM selected_ids WHERE key=123); 

Ein anderer Ansatz ist die Verwendung von Sammlungen - die Syntax hierfür hängt von Ihrem DBMS ab.

Schließlich gibt es immer diese "kludgy" -Ansatz:

SELECT * FROM some_table WHERE '|1001|2002|3003|' LIKE '%|' || id || '|%'; 
+2

BITTE vermeiden Sie die LIKE-Option. String-Konvertierungen sind langsam, String-Vergleiche sind langsam und LIKE '% ...%' bedeutet, dass Indizes nicht verwendet werden können. Ich kann nicht übertreiben, wie viel diese Option vermieden werden sollte (imo). – MatBailie

7

Die erste (naive) Option:

SELECT * FROM some_table WHERE id IN ('1001', '2002', '3003' ...) 

Allerdings sollten wir in der Lage sein, besser zu machen. IN ist sehr schlecht, wenn Sie viele Artikel haben, und Sie haben Hunderte dieser IDs erwähnt. Was schafft sie? Woher kommen sie? Können Sie eine Abfrage schreiben, die diese Liste zurückgibt? Wenn ja:

SELECT * 
FROM some_table 
INNER JOIN (your query here) filter ON some_table.id=filter.id 
2

ORs sind in SQL notorisch langsam.

Ihre Frage ist kurz auf Besonderheiten, aber je nach Ihren Anforderungen und Einschränkungen würde ich eine Look-up-Tabelle mit IDs bauen und die EXISTS verwenden:

select t.id from some_table t 
where EXISTS (select * from lookup_table l where t.id = l.id) 
0

In Oracle, habe ich immer die id setzen 's in ein TEMPORARY TABLE auszuführen massiven SELECT' s und DML Operationen:

CREATE GLOBAL TEMPORARY TABLE t_temp (id INT) 


SELECT * 
FROM mytable 
WHERE mytable.id IN 
     (
     SELECT id 
     FROM t_temp 
     ) 

Sie können die temporäre Tabelle in einem einzigen Client-Server-Roundtrip füllen 012 mitSammlungsarten.

+0

Kann mir jemand sagen, ob temporäre Tabellen gut oder schlecht sind? –

+0

Für eine Aufgabe wie diese sind sie sicherlich gut. – Quassnoi

+0

Zuerst produzieren sie kein REDO und kein UNDO, was bedeutet, dass sie etwa 20 mal schneller sind als permanente. – Quassnoi

0

Wir haben ein ähnliches Problem in einer Anwendung für MS SQL Server geschrieben 7. Obwohl ich die Lösung verwendet nicht mögen, sind wir von nichts wissen besser ...

‚Besser‘ existieren Lösungen bis 2008 Wie ich weiß, aber wir haben Zero-Clients mit dem :)


Wir erstellten eine Tabelle Wert benutzerdefinierte Funktion, die eine durch Kommas getrennte Zeichenfolge von IDs und gibt eine Tabelle von IDs zurück. Die SQL liest dann einigermaßen gut, und nichts davon ist dynamisch, aber es gibt immer noch den lästigen doppelten Overhead:
1.Der Client verkettet die IDs in die Zeichenfolge
2. SQL Server analysiert die Zeichenfolge, um eine Tabelle mit IDs zu erstellen

Es gibt viele Möglichkeiten, '1,2,3,4,5' in eine ID-Tabelle zu verwandeln, aber die gespeicherte Prozedur, die die Funktion verwendet endet aussehen wie ...

CREATE PROCEDURE my_road_to_hell @IDs AS VARCHAR(8000) 
AS 
BEGIN 

    SELECT 
     * 
    FROM 
     myTable 
    INNER JOIN 
     dbo.fn_split_list(@IDs) AS [IDs] 
     ON [IDs].id = myTable.id 

END 
0

die schnellste ist die IDs in einer anderen Tabelle zu setzen und JOIN

SELECT some_table.* 
FROM some_table INNER JOIN some_other_table ON some_table.id = some_other_table.id 

wo some_other_table würde nur ein Feld hat (ids) und alle Werte wären eindeutig

Verwandte Themen