【问题标题】:SQLite Android Join operation on FTS4FTS4上的SQLite Android Join操作
【发布时间】:2017-10-25 10:00:50
【问题描述】:

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。任何人都请解释一下。内部发生了什么?此外,任何指向参考网站的链接都将不胜感激。

【问题讨论】:

  • 你为什么要在 TABLE2 上加入 TABLE2 ?另外,MATCH 是用于匹配列,而不是匹配表。
  • 这是一个错字。我编辑了它。对不起。也可以根据 sqlite doc table 为左侧指定。在这种情况下,它将尝试从所有列中进行匹配。

标签: android sqlite android-sqlite fts4


【解决方案1】:

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

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

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

【讨论】:

  • 那么在query1中第一个FTS表首先评估匹配然后加入table2是否正确?
  • 是的,这是查询优化器碰巧使用的顺序。
  • 只有sqlite吗?据我所知,mysql 的工作方式与此不同。
  • 那么您是在 Android 上运行带有 FTS4 的 MySQL 吗? ;-)
  • 不,我说的是加入启用全文索引的 MyIsam 表和 InnoDb 表。我的意思是它是 sql 规范的默认行为还是特定于 Sqlite。
猜你喜欢
  • 1970-01-01
  • 2015-05-19
  • 1970-01-01
  • 1970-01-01
  • 2017-10-28
  • 1970-01-01
  • 2015-11-02
  • 2016-12-10
  • 2012-02-26
相关资源
最近更新 更多