1

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 表需要首先出现在 LEFT OUTER JOIN 上。为什么会这样?加入首先发生在应用 WHERE 子句之前。因此,如果它不适用于表类型不匹配,我假设它也不适用于 query1。任何人都请解释一下。内部发生了什么?此外,任何指向参考站点的链接都将不胜感激解释这一点。

4

1 回答 1

3

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

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

SELECT *
FROM Table2 LEFT JOIN (SELECT *
                       FROM Table1
                       WHERE Table1 MATCH ...)
            USING (id);
于 2017-05-25T07:38:41.300 回答