var*_*uog 1 sqlite android fts4 android-sqlite
Table1是虚拟表,其中fts4和TABLE2是normal table。
查询1 (有效)
SELECT * FROM TABLE1 LEFT OUTER JOIN TABLE2 ON TABLE1.id=TABLE2.id WHERE TABLE1 MATCH 'sometext' LIMIT %d,%d
Run Code Online (Sandbox Code Playgroud)
查询 2(不起作用)
SELECT * FROM TABLE2 LEFT OUTER JOIN TABLE1 ON TABLE1.id=TABLE2.id WHERE TABLE1 MATCH 'sometext' LIMIT %d,%d
Run Code Online (Sandbox Code Playgroud)
查询 2 出错
android.database.sqlite.SQLiteException:无法在请求的上下文中使用函数 MATCH(代码 1)
由此看来,FTS 表需要首先出现在 LEFT OUTER JOIN 上。为什么会发生这种情况?连接首先发生在应用 WHERE 子句之前。因此,如果它不适用于表类型不匹配,我假设它也不适用于 query1。请任何人解释一下这一点。内部发生了什么?另外,任何指向参考站点的链接都将不胜感激,以解释这一点。
MATCH仅适用于FTS表本身,因此必须在连接之前执行。在第二个查询中,数据库首先查找匹配的行(使用外连接,它无法选择连接顺序),并且该临时结果不再是FTS表。
使用 FTS 时,通常最好将 FTS 搜索(或其他搜索)移至子查询中:
SELECT *
FROM Table2 LEFT JOIN (SELECT *
FROM Table1
WHERE Table1 MATCH ...)
USING (id);
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1152 次 |
| 最近记录: |