2010-04-08 4 views
3

je le tableau suivant dans une base de données SQLite3:Utilisation de IN avec des ensembles de tuples dans SQL (SQLite3)

CREATE TABLE overlap_results (
neighbors_of_annotation varchar(20), 
other_annotation varchar(20), 
set1_size INTEGER, 
set2_size INTEGER, 
jaccard REAL, 
p_value REAL, 
bh_corrected_p_value REAL, 
PRIMARY KEY (neighbors_of_annotation, other_annotation) 
); 

Je voudrais effectuer la requête suivante:

SELECT * FROM overlap_results WHERE 
(neighbors_of_annotation, other_annotation) 
IN (('16070', '8150'), ('16070', '44697')); 

C'est, J'ai un couple de tuples d'annotations, et je voudrais chercher enregistrements pour chacun de ces tuples. L'invite de sqlite3 me donne l'erreur suivante:

SQL error: near ",": syntax error 

Comment puis-je exprimer correctement cela comme une instruction SQL?


EDIT Je me rends compte que je ne l'ai pas bien expliquer ce que je suis vraiment après. Laissez-moi essayer une autre fissure à cela.

Si une personne me donne une liste arbitraire de termes neighbors_of_annotation qu'ils sont intéressés, je peux écrire une instruction SQL comme ce qui suit:

SELECT * FROM overlap_results WHERE 
neighbors_of_annotation 
IN (TERM_1, TERM_2, ..., TERM_N); 

Mais supposons maintenant que personne veut me donner des paires de termes si le formulaire (TERM_1,1, TERM_1,2), (TERM_2,1, TERM_2,2), ..., (TERM_N,1, TERM_N,2), où TERM_i,1 est en neighbors_of_annotation et TERM_i,2 est en other_annotation. Le langage SQL fournit-il un moyen tout aussi élégant de formuler la requête pour les couples (tuples) d'intérêt?

La solution la plus simple semble être de créer une nouvelle table, juste pour ces paires, puis se joindre à cette table avec la table à interroger et sélectionner uniquement les lignes où les premiers termes et les termes du deuxième match. La création de tonnes d'instructions AND/ OR semble effrayante et propice aux erreurs.

Répondre

4

Je n'ai jamais vu de SQL comme ça. Si cela existe, je suppose que c'est une extension non standard. Essayez:

SELECT * FROM overlap_results 
WHERE neighbors_of_annotation = '16070' 
AND other_annotation = '8150' 
UNION ALL SELECT * FROM overlap_results 
WHERE neighbors_of_annotation = '16070' 
AND other_annotation = '44697'; 

En d'autres termes, construire la requête dynamique de vos tuples mais comme une série de syndicats à la place, ou comme une série de ANDs au sein ORS:

SELECT * FROM overlap_results 
WHERE (neighbors_of_annotation = '16070' AND other_annotation = '8150') 
OR (neighbors_of_annotation = '16070' AND other_annotation = '44697'); 

Ainsi, au lieu de code (pseudo-code, testé uniquement dans ma tête si le débogage est de votre responsabilité) tels que:

query = "SELECT * FROM overlap_results" 
query += " WHERE (neighbors_of_annotation, other_annotation) IN (" 
sep = "" 
for element in list: 
    query += sep + "('" + element.noa + "','" + element.oa + "')" 
    sep = "," 
query += ");" 

vous à la place quelque chose comme:

query = "SELECT * FROM overlap_results " 
sep = "WHERE " 
for element in list: 
    query += sep + "(neighbors_of_annotation = '" + element.noa + "'" 
    query += " AND other_annotation = '" + element.oa + "')" 
    sep = "OR " 
query += ";" 
2

Je ne suis pas au courant de dialectes SQL qui prennent en charge les tuples dans les clauses IN. Je pense que vous êtes coincé avec:

SELECT * FROM overlap_results WHERE (neighbors_of_annotation = '16070' and other_annotation = '8150') or (neighbors_of_annotation = '16070' and other_annotation = '44697') 

Bien sûr, cette requête particulière peut être simplifiée à quelque chose comme:

SELECT * FROM overlap_results WHERE neighbors_of_annotation = '16070' and (other_annotation = '8150' or other_annotation = '44697') 

En général SQL clause WHERE prédicats ne permettent que le filtrage sur une seule colonne.

+0

Ceci est une bonne solution pour deux paires. J'ai mis à jour ma question pour noter que nous pouvons recevoir plusieurs paires pour lesquelles chercher. Construire une requête avec 'AND/OR' devient encombrant très rapidement. – gotgenes

Questions connexes