6

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)
);

次のクエリを実行したいと思います。

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

つまり、アノテーション ID のタプルがいくつかあり、それらのタプルごとにレコードを取得したいと考えています。sqlite3 プロンプトで次のエラーが表示されます。

SQL error: near ",": syntax error

これをSQL文として適切に表現するにはどうすればよいですか?


編集私が本当に求めているものをうまく説明していないことに気づきました。これで別のクラックを試してみましょう。

ある人が興味のある用語の任意のリストをくれた場合neighbors_of_annotation、次のような SQL ステートメントを書くことができます。

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

しかし今、その人が(TERM_1,1, TERM_1,2), , (TERM_2,1, TERM_2,2)...,という形の用語のペアを私に与えたいと思っているとします。SQL 言語は、関心のあるペア (タプル) のクエリを定式化するための同様に洗練された方法を提供しますか?(TERM_N,1, TERM_N,2)TERM_i,1neighbors_of_annotationTERM_i,2other_annotation

最も簡単な解決策は、これらのペアのためだけに新しいテーブルを作成し、そのテーブルをクエリ対象のテーブルに結合し、最初の用語と2番目の用語が一致する行のみを選択することです。大量のAND / ORステートメントを作成するのは恐ろしく、エラーが発生しやすいように見えます。

4

2 に答える 2

4

私はそのような SQL を見たことがありません。存在する場合、それは非標準の拡張機能であると思われます。試す:

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';

つまり、タプルから動的クエリを作成しますが、代わりに一連のユニオンとして、または OR 内の一連の AND として作成します。

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

したがって、次のようなコード(疑似コード、頭の中でのみテストされているため、デバッグはあなたの責任です)の代わりに:

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 += ");"

代わりに次のようなものがあります。

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 += ";"
于 2010-04-08T01:31:10.803 に答える
2

IN 句内のタプルをサポートする SQL ダイアレクトは知りません。私はあなたが立ち往生していると思います:

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

もちろん、この特定のクエリは次のように簡略化できます。

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

一般に、SQL WHERE 句の述部では、単一列でのフィルタリングのみが許可されます。

于 2010-04-08T01:31:55.083 に答える