该项目包含一个表–为简单起见,我们将其称为Table
–由C程序处理三列:
ID
是唯一的ID,在这里并不重要Source
包含输入文本。Translation
包含Source
中内容的修改/翻译版本。这是一个包含内容的示例:
如您所见,表格遵循某种模式,目标是根据以下规则查找不一致之处:
Source
和Translation
都包含大多数不遵循此模式的条目(上面省略)。Source
设置为ABC
和另一个记录B的Source
设置为Map: ABC
(与Map:
相同, A的Source
),那么B的Translation
必须与Karte:
相同,后跟A的Translation
。换句话说:应该假设Translation
列遵循与Source
相同的模式。ID_34567
和ID_45678
不匹配,因为后者的Translation
读为Karte: Project B
而不是{{ 1}}(由Karte: Projekt B
的{{1}}决定)。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
虽然这很好用,但这不是最快的查询,我想知道是否有更优雅的方法可以简化并同时加快速度。
答案 0 :(得分:2)
SELECT ...
FROM MyTable AS A
JOIN MyTable AS B ON 'Map: ' || A.Source = B.Source
AND 'Karte: ' || A.Translation <> B.Translation;
这需要Source
上的索引有效(或者,如果您有磁盘空间,最好在Source
和Translation
上都使用covering index)。