SQLite Android FTS4 上的加入操作

SQLite Android Join operation on FTS4

Table1 是虚拟 Table,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

查询 2 出错

android.database.sqlite.SQLiteException: unable to use function MATCH in the requested context (code 1)

由此看来,FTS 表似乎需要在 LEFT OUTER JOIN 上排在第一位。为什么会这样?加入首先发生在应用 WHERE 子句之前。因此,如果它不适用于 table 类型不匹配,我假设它也不适用于 query1。任何人请解释这一点。内部发生了什么?另外任何 link 参考站点将不胜感激解释这一点。

MATCH 仅对 FTS table 本身有效,因此必须在连接之前执行。 在第二个查询中,数据库首先查找匹配的行(对于外连接,它无法选择连接顺序),并且该临时结果不再是 FTS table.

使用 FTS 时,将 FTS 搜索(或其他搜索)移动到子查询中通常是更好的主意:

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