2011-10-28 5 views
0

だから、私は危険なほど多くのSQLを知っている。私はSQLiteデータベースからデータのセクションを表示し、特定の基準に基づいてデータの一部を反復処理する必要のあるアプリケーションを開発しています。SQLiteはサブクエリのクエリ固有のインデックスを見つける

だから私はこのようになりますテーブルを持っている:

create table packets(id INTEGER PRIMARY KEY, timestamp varchar(32), type varchar(32), source varchar(32), destination varchar(32), channel varchar(16), first_sequence integer, last_sequence integer, missing integer); 

その後、私は特定の条件に基づいて、データの一部またはすべてを表示するビューを持っています。

私たちは数百万行のテーブルについて話しています。そのため、すべてをメモリにロードすることはできません。だから私はビュー内のインデックスに基づいて個々に各項目を求めるビュークラスを持っています。例えばので

、私は「C」のチャンネル値を持つすべてのパケットを表示しています、そしてビューが、私は、データベースにこのクエリを発行する最初の項目を描画する準備ができている場合:

SELECT * FROM packets WHERE channel='C' LIMIT 1 OFFSET 0 

それは私が

SELECT * FROM packets WHERE channel='C' LIMIT 1 OFFSET 1 

などを行う2番目の項目を描画する準備ができてい...

これが正常に動作します。私はそれがおそらく最も最適な方法ではないことに気づいていますが、私はSQLiteを使って最も簡単な方法を学び、後で最適化を心配しています。

ここで問題は、別の検索基準に基づいてこの結果セット内のアイテムを検索し、元の結果セット内のインデックスを取得できることです。

たとえば、「欠落」値が1である元の結果セット内のアイテムを繰り返し処理し、それらのアイテムのビューインデックスを把握できる必要があります。

私はこれに似た何かでそれを行うことができると思いテーブル内の全データセット使用している場合:私は、データのサブセット内のインデックスを必要とするときのROWID doesnの、

SELECT rowid FROM packets WHERE rowid > [currentlySelectedRowID] AND missing=1 LIMIT 1 

をしかし、本当に私を助けてくれるわけではなく、すべての項目を個別に繰り返し処理することなく、サブセット内のインデックスを見つける方法がわかりません。

SQLクエリでこれを行う方法や、関連するドキュメントやチュートリアルへのポインタについては、非常に感謝しています。

ありがとうございます!

は(注:それはそれを説明する方法の私の心に少し複雑だとして何かが明確でない場合、私は詳しく説明しようとしますので、質問は、意味を持たないかもしれません。)

編集:実際に私がことがわかりましたLIMIT -1 OFFSET [startIndex]を実行して、最初の索引の後に結果セット全体を照会し、次に欠落している項目を見つけるまで実行することで、パフォーマンスの観点からは十分です。しかし、将来の参照のために、SQLステートメントでそれを行う方法があるかどうかを知ることは、まだ素晴らしいことです。

答えて

1

複数の行を返すSELECT文にORDER BY句がない場合、行の返される順序は未定義です。

最初のクエリでは重要ではありませんが、サブセットのドメインに同じ初期セットを使用するため、サブセットを作成する必要がある場合は重要になります。

使用

SELECT rowid,* FROM packets WHERE channel='C' ORDER BY rowid LIMIT N? OFFSET M? 

結果に順序を課します。次に、それらの中のサブセットを見つけるために

SELECT rowid 
FROM (SELECT rowid,* FROM packets WHERE channel='C' ORDER BY rowid LIMIT N? OFFSET M?) 
WHERE missing=1 LIMIT 1 

を実行することができます。

補足:メインSELECTステートメントから返された「ROWID」は、この一時テーブルのROWIDを反映していますか?

はい...

sqlite> create table packets (channel, missing); 
sqlite> insert into packets values ('A',0); 
sqlite> insert into packets values ('B',0); 
sqlite> insert into packets values ('C',0); 
sqlite> select * from packets; 
A|0 
B|0 
C|0 
sqlite> create temp table tt as SELECT rowid,* FROM packets WHERE channel='C'; 
sqlite> select rowid,* from tt; 
3|3|C|0 
sqlite> insert into packets values ('C',1); 
sqlite> drop table tt; 
sqlite> create temp table tt as SELECT rowid,* FROM packets WHERE channel='C'; 
sqlite> select rowid,* from tt; 
3|3|C|0 
4|4|C|1 
sqlite> 
+0

ORDER BYについてのヒントのためのおかげで、私はいつも結果はROWIDによって順序にデフォルト設定を想定。私はそのようなことを想定するよりもよく知るべきです。内部のSELECTステートメントが一時テーブルを作成する場所を読んでいると思います。この場合、メインのSELECTステートメントから返された「ROWID」がこの一時テーブルのROWIDを反映していますか? – Gerald

+0

@Gerald、はい、私の答えに補遺を見てください。 –

+0

情報ありがとうございます。しかし、rowidがtempテーブルではなく元のテーブルのROWIDを反映しているように見えます。私が本当に必要とするのは、パケットのサブセットへのインデックスです。つまり、あなたの例に基づいて、もしttの最初の 'missing'値1に対してクエリを実行すると、サブセット内のインデックスを反映するために、4の代わりに2のインデックスを取得する必要があります。申し訳ありませんが、私はそれについて不明でした。 – Gerald

関連する問題