寻找这些不一致之处的最有效方法?

时间:2018-08-16 14:16:18

标签: sqlite

该项目包含一个表–为简单起见,我们将其称为Table –由C程序处理三列:

  • ID是唯一的ID,在这里并不重要
  • Source包含输入文本。
  • Translation包含Source中内容的修改/翻译版本。

这是一个包含内容的示例: Example Table

如您所见,表格遵循某种模式,目标是根据以下规则查找不一致之处:

  • 所有ID都是唯一的,并且没有可用的关联将相关条目彼此连接。
  • SourceTranslation都包含大多数不遵循此模式的条目(上面省略)。
  • 如果有一个记录A的Source设置为ABC和另一个记录B的Source设置为Map: ABC(与Map:相同, A的Source),那么B的Translation必须与Karte:相同,后跟A的Translation。换句话说:应该假设Translation列遵循与Source相同的模式。
  • 在上面的示例表中,查询结果应告诉您ID_34567ID_45678不匹配,因为后者的Translation读为Karte: Project B而不是{{ 1}}(由Karte: Projekt B的{​​{1}}决定)。
  • 该查询(或多个查询)应该在SQLite中实现,并以C代码托管(因此不必仅在SQLite中为100%)。
  • 可用的SQLite命令扩展了用于正则表达式匹配(PCRE2)的自定义函数,例如Translation返回ID_34567与正则表达式匹配的部分,或者rxmatch(rx, text)返回不匹配的情况。可以根据需要扩展或修改此列表。

到目前为止,该实现首先使用查询来识别所有text条目:

0

第二个查询针对每个结果行运行,并检查不一致之处以返回它们(它从Map: / select ID, rxmatch('(?<=Map: ).*', Source) as ms, rxmatch('(?<=: ).*', Translation) as mt from `Table` where ms != 0 and mt != 0; 中选择了连接的字段,但出于可读性考虑,我将其省略)。使用的参数是上面返回的三列(id,匹配的源部分,匹配的目标部分)。

a

虽然这很好用,但这不是最快的查询,我想知道是否有更优雅的方法可以简化并同时加快速度。

1 个答案:

答案 0 :(得分:2)

SELECT ...
FROM MyTable AS A
JOIN MyTable AS B ON 'Map: '   || A.Source      =  B.Source
                 AND 'Karte: ' || A.Translation <> B.Translation;

这需要Source上的索引有效(或者,如果您有磁盘空间,最好在SourceTranslation上都使用covering index)。