0

私は、フィールド「名」、「姓」、および(姓、名)から形成されたインデックスを持つSQLite DBテーブルに取り組んでいます。プライマリ インデックスは、整数の名前 ID です。検索引数(文字列)で始まる最初の名字を探したいのですが、

SELECT Given, Surname FROM NameTable WHERE Surname>'C' LIMIT 1

次に、Surname+Given インデックスを介して、一度に 1 行ずつ前進または後退します。SQLIte の「スクロール カーソル」の記事を読みましたが、その解決策は私のプログラムの構造に完全には適合しません。最近取得した姓を保存してから、これよりも小さい姓を照会すると、最新の名前の前に同じ姓を持ついくつかの名前がスキップされる可能性があるため、機能しません。

これは単純なインデックスに基づいているため、インデックスをステップ実行できる必要があります。(テーブル自体ではなく) インデックスの ROWID を直接参照することは可能ですか? たとえば、インデックスの行 1234 に対応するレコードを取得したばかりで、前に戻りたい場合、次のようにするにはどうすればよいでしょうか。

SELECT Given, Surname FROM NameTable WHERE ROWID<1234 (I realize this ROWID will refer to the table, not the index)

テーブルには、次のようなエントリが含まれます。

阿部 スミス
バーニー・スミス
スミス、メアリー
スミス、マイク
...

スクロール間にDBに対して多くのクエリが発生する可能性があるため、準備/ステップアプローチを使用できないと思います。

別の方法として、姓と名を連結する検索引数をどのように作成しますか? それをプレースホルダーとして使用できます。

事前に感謝し、SQL初心者であることをお詫びします.

4

2 に答える 2

0

まず、「インデックスの ROWID」は必要ありません。それはナンセンスだからです。インデックスにはそのような意味での行 ID がなく、それらを検索することはありません (代わりに、テーブルの検索を高速化するために使用されます)。行の行 ID が必要であり、Given および Surname 列と同時に取得できます。ROWID を取得したら、指定された (前の) ROWID よりも大きい ROWID を持ち、他の基準にも一致する最初の行を探すことで、次の行をフェッチできます。これはかなり効率的なクエリになります (または、少なくとも元のクエリよりもそれほど悪くはありません)。

状況が非常に複雑になっている場合は、関連するデータを一時テーブルにコピーし、その上でページングを行います。最初のクエリが完了すると、その方が高速であることがわかります。

于 2013-01-03T01:22:15.067 に答える