在FTS4上的SQLite Android Join操作

时间:2017-05-24 21:37:04

标签: android sqlite android-sqlite fts4

Table1是虚拟表,fts4TABLE2normal table

查询1 (工作)

 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

来自Query2的错误

  

android.database.sqlite.SQLiteException:无法使用函数MATCH   在请求的上下文中(代码1)

从这看起来好像FTS tabl需要在LEFT OUTER JOIN上首先出现。为什么会这样?在应用WHERE子句之前首先进行连接。因此,如果它不适用于表类型不匹配,我认为它也不适用于query1。有人请解释一下。内部发生了什么?此外,任何参考网站的链接将不胜感激地解释这一点。

1 个答案:

答案 0 :(得分:1)

MATCH仅适用于FTS表本身,因此必须在连接之前执行。 在第二个查询中,数据库首先查找匹配的行(使用外部联接,在连接顺序中没有选择),并且该临时结果不再是FTS表。

使用FTS时,最好将FTS搜索(或其他搜索)移动到子查询中:

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