1

そのため、複数のデータベースをアタッチしてから、さまざまなデータベースのすべての仮想テーブルを組み合わせた TEMP VIEW を作成しています。

theDatabase.execSQL("CREATE TEMP VIEW virtualView AS SELECT * FROM Virtual_Sites UNION SELECT * FROM db1.Virtual_Sites UNION SELECT * FROM db2.Virtual_Sites");

この VIEW で MATCH クエリを使用することは可能ですか?

theDatabase.rawQuery(SELECT * FROM virtualView WHERE all_text MATCH 21033, null)

現在、このエラーが発生しています。

sqlite returned: error code = 1, msg = statement aborts at 46: [SELECT * FROM virtualView WHERE all_text MATCH 21033] unable to use function MATCH in the requested context, db=xxx

exception: SQL logic error or missing database; query: SELECT * FROM virtualView WHERE all_text MATCH 21033

この方法で VIEW を作成すると、基になるテーブルのインデックスが継承されないことを読みましたが、これが MATCH を実行できない理由ですか? もしそうなら、回避策はありますか?

ありがとう

4

2 に答える 2

1

MATCHビューではなく、この演算子を実装する仮想テーブルでのみ直接機能します。

個々のテーブルで使用するすべてのクエリを書き直してMATCH、それらの結果を と組み合わせる必要がありUNION ALLます。

または、すべてのテーブルのデータを 1 つの一時テーブルにコピーします。

于 2013-03-05T11:59:00.380 に答える
0

これが私が見つけたものです。複数のデータベース/テーブルを組み合わせると、ビューに 2 つ以上のテーブルが含まれると下線付きのインデックスが失われるため、ビューは非効率的です。

取り付ける

String newDbPath = DB_PATH + DB_NAME;
theDatabase.execSQL("ATTACH DATABASE '" + newDbPath + "' as db1;");

非効率な方法

Create VIEW
theDatabase.execSQL("CREATE TEMP VIEW view1 AS SELECT * FROM Sites_hsf UNION SELECT * FROM db1.Sites_hsf UNION SELECT * FROM db2.Sites_hsf;");

Query VIEW
sqlStatement = "SELECT * FROM view1 s INNER JOIN view2 con ON s.site_uid = con.site_uid AND con.ap_active = 1 WHERE s.site_uid = 1114331";

実行時間 16281 ミリ秒

効率的な方法

sqlStatement = "SELECT * FROM Sites_hsf s INNER JOIN Connections_hsf con ON s.site_uid = con.site_uid AND con.ap_active = 1 WHERE s.site_uid = 1114331 " +
                "UNION ALL " +
                "SELECT * FROM db1.Sites_hsf s1 INNER JOIN db1.Connections_hsf con1 ON s1.site_uid = con1.site_uid AND con1.ap_active = 1 WHERE s1.site_uid = 1114331 " +
                "UNION ALL " +
                "SELECT * FROM db2.Sites_hsf s2 INNER JOIN db2.Connections_hsf con2 ON s2.site_uid = con2.site_uid AND con2.ap_active = 1 WHERE s2.site_uid = 1114331";

実行時間 4 ミリ秒


UNION ALLのCL.の回答を使用したMATCH

sqlStatement = "SELECT * FROM Virtual_Sites_hsf WHERE all_text MATCH '40227' " +
                "UNION ALL SELECT * FROM db1.Virtual_Sites_hsf WHERE all_text  MATCH '40227'" +
                "UNION ALL SELECT * FROM db2.Virtual_Sites_hsf WHERE all_text  MATCH '40227'"

うまくいけば、これは誰かを助けます。

于 2013-03-05T17:14:42.253 に答える