我有一个使用 FTS4 模块生成的 SQLite 表。每个条目至少用不同的语言列出两次,但仍共享一个唯一 ID(int 列,未编入索引)。这是我想要做的:我想用首选语言查找一个术语。我想将结果与使用另一种语言的相同术语的查找结合起来。不过,对于第二次查找,我想忽略在第一次查找期间已经找到的所有条目(由其 ID 标识)。所以基本上我想这样做:
WITH term_search1 AS (
SELECT *
FROM myFts
WHERE myFts MATCH 'term'
AND languageId = 1)
SELECT *
FROM term_search1
UNION
SELECT *
FROM myFts
WHERE myFts MATCH 'term'
AND languageId = 2
AND id NOT IN (SELECT id FROM term_search1)
这里的问题是 term_seach1 查询将被执行两次。有没有办法实现我的结果?任何将其限制为 2 个查询(而不是 3 个)的解决方案都会很棒。
我还尝试使用递归查询,例如:
WITH RECURSIVE term_search1 AS (
SELECT *
FROM myFts
WHERE myFts MATCH 'term'
AND languageId = 1
UNION ALL
SELECT m.*
FROM myFts m LEFT OUTER JOIN term_search1 t ON (m.id = t.id)
WHERE myFts MATCH 'term'
AND m.languageId = 2
AND t.id IS NULL
)
SELECT * FROM term_search1
这也没有用。显然他刚刚对 languageId = 2 执行了两次查找(这可能是一个错误吗?)。
提前致谢 :)