2009-04-20 4 views

risposta

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

e se i vostri ID noti sono provenienti da un altro tavolo

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

Per un insieme fisso di ID si può fare:

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

Per un set che cambia ogni volta, potresti voler creare una tabella per tenerli e quindi interrogare:

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

Un altro approccio consiste nell'utilizzare le raccolte: la sintassi dipende dal DBMS.

Infine, c'è sempre questo approccio "kludgy":

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

PER FAVORE, evitare l'opzione LIKE. Le conversioni di stringhe sono lente, i confronti tra stringhe sono lenti e LIKE '% ...%' significa che gli indici non possono essere utilizzati. Non posso esagerare su quanto questa opzione dovrebbe essere evitata (imo). – MatBailie

7

Il primo (naive) opzione:

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

Tuttavia, dovremmo essere in grado di fare meglio. IN è molto brutto quando hai molti articoli e hai menzionato centinaia di questi id. Cosa li crea? Da dove vengono? Puoi scrivere una query che restituisce questa lista? In tal caso:

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

Gli OR sono notoriamente lenti in SQL.

La tua domanda è a corto di dettagli, ma a seconda delle esigenze e dei vincoli che avrebbe costruito una tabella di look-up con gli ID e utilizzare il predicato EXISTS:

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

In Oracle, ho sempre messo il id 's in un TEMPORARY TABLE per eseguire massiccia SELECT' s e DML operazioni:

CREATE GLOBAL TEMPORARY TABLE t_temp (id INT) 


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

È possibile compilare la tabella temporanea in un singolo andata e ritorno client-server utilizzando Oracle tipi di raccolta.

+0

Qualcuno può dirmi se i tavoli temporanei sono buoni o cattivi? –

+0

Per un compito come questo sono sicuramente buoni. – Quassnoi

+0

Prima di tutto, non producono alcun REDO e nessun UNDO, il che significa che sono circa 20 volte più veloci di quelli permanenti. – Quassnoi

0

Abbiamo un problema simile in un'applicazione scritta per MS SQL Server 7. Anche se non mi piace la soluzione utilizzata, non siamo a conoscenza di qualcosa di meglio ...

esistono soluzioni 'meglio', nel 2008, per quanto come so, ma abbiamo zero client che lo utilizzano :)


Abbiamo creato una tabella con una funzione definita dall'utente che accetta una stringa delimitata da virgole di ID e restituisce una tabella di ID. L'SQL quindi legge ragionevolmente bene, e nessuno di questi è dinamico, ma c'è ancora il fastidioso doppio overhead:
1.Cliente concatena gli ID nella stringa
2. SQL Server analizza la stringa per creare una tabella di ID

Ci sono molti modi di trasformare '1,2,3,4,5' in una tabella di ID, ma la stored procedure che utilizza la funzione finisce per assomigliare ...

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

il più veloce è quello di mettere gli id ​​in un altro tavolo e JOIN

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

dove some_other_table avrebbe avuto solo un campo (ids) e tutti i valori sarebbero unici

Problemi correlati