2017-05-24 6 views
0

Table1は仮想テーブルで、fts4TABLE2normal tableです。FTS4のSQLite Android結合操作

Query1を(WORKS)

SELECT * FROM TABLE1 LEFT OUTER JOIN TABLE2 ON TABLE1.id=TABLE2.id WHERE TABLE1 MATCH 'sometext' LIMIT %d,%d 

クエリ2(動作しません)

SELECT * FROM TABLE2 LEFT OUTER JOIN TABLE1 ON TABLE1.id=TABLE2.id WHERE TABLE1 MATCH 'sometext' LIMIT %d,%d 

エラーandroid.database.sqlite

QUERY2
から。 SQLiteEx ception:要求されたコンテキストで関数MATCH を使用することができません(コード1)

このことから、FTSのTABL JOINをLEFT OUTERに最初にする必要があるように思えます。なぜこれが起こっているのですか? WHERE句を適用する前に結合が先に行われます。テーブル型の不一致のために動作していなかった場合、私はそれがquery1でも動作しないと想定していました。誰でもこれを説明してください。内部的に何が起こっていますか?また、参照サイトへのリンクはこれを説明していただければ幸いです。

+0

は、なぜあなたはTABLE2にTABLE2に参加しようとしていますか?また、MATCHは、表と一致しない列を照合するためのものです。 – BladeCoder

+0

それはタイプミスでした。私はそれを編集した。ごめんなさい。また、sqliteごとにdocテーブルを左側に指定することもできます。その場合、すべての列から一致を試みます。 – varuog

答えて

1

MATCHはFTSテーブル自体でのみ動作するため、結合前に実行する必要があります。 2番目のクエリでは、データベースは一致する行を最初に検索します(外部結合では結合順序に選択肢がありません)。その一時的な結果はもはやFTS表ではなくなりました。

FTSを使用している場合、通常、サブクエリの中にFTSの検索(または他の検索)を移動する良いアイデアです:

SELECT * 
FROM Table2 LEFT JOIN (SELECT * 
         FROM Table1 
         WHERE Table1 MATCH ...) 
      USING (id); 
+0

それでは、最初に評価された最初のFTSテーブルをquery1に入れてから、table2と結合するのは正しいですか? – varuog

+0

はい、クエリオプティマイザが使用する順序です。 –

+0

はsqliteでのみ使用できますか?私はこれまでとは違うmysqlを思い出すことができます。 – varuog