SQLite 比较查询 Python
我一直在想怎么写一个查询,来比较两个表中的行。我的目标是看看结果集A中的两个元组是否在更大的结果集B中。我只想看到查询结果中不同的元组。
'''SELECT table1.field_b, table1.field_c, table1.field_d
'''FROM table1
'''ORDER BY field_b
results_a = [(101010101, 111111111, 999999999), (121212121, 222222222, 999999999)]
'''SELECT table2.field_a, table2.fieldb, table3.field3
'''FROM table2
'''ORDER BY field_a
results_b =[(101010101, 111111111, 999999999), (121212121, 333333333, 999999999), (303030303, 444444444, 999999999)]
所以我想做的是,检查results_a中的内容,确保它们在results_b中有完全相同的匹配。因为第二个元组的第二条记录和results_a中的内容不同,所以我想返回results_a中的第二个元组。
最终,我希望返回一个集合,其中也包含在另一个集合中没有匹配的第二个元组,这样我就可以在我的程序中同时引用这两个元组。理想情况下,由于第二个元组的主键(table1中的field_b)与table2中对应的主键(field_a)不匹配,我想显示results_c = {(121212121, 222222222, 999999999):(121212121, 222222222, 999999999)}。这变得复杂,因为两个表中的结果不会按相同的顺序排列,所以我不能写代码说“比较results_a中的元组2和results_b中的元组2”。更像是“比较results_a中的元组2,看看它是否与results_b中的任何记录匹配。如果主键匹配,但results_b中的元组没有完全匹配或者没有找到部分匹配,就返回那些不匹配的记录。
抱歉我说得这么啰嗦。我想不出更好的解释方式。任何帮助都将不胜感激。
谢谢!
更新:关于部分匹配的努力
a = [(1, 2, 3),(4,5,7)]
b = [(1, 2, 3),(4,5,6)]
pmatch = dict([])
def partial_match(x,y):
return sum(ea == eb for (ea,eb) in zip(x,y))>=2
for el_a in a:
pmatch[el_a] = [el_b for el_b in b if partial_match(el_a,el_b)]
print(pmatch)
输出 = {(4, 5, 7): [(4, 5, 6)], (1, 2, 3): [(1, 2, 3)]}。我本来期待它只是 {(4,5,7):(4,5,6)},因为这些是唯一不同的集合。有什么想法吗?
1 个回答
把results_a里的内容和results_b里的内容进行对比,确保results_a中的每一项在results_b中都有完全相同的项:
for el in results_a:
if el in results_b:
...
获取部分匹配的结果:
pmatch = dict([])
def partial_match(a,b):
# for instance ...
return sum(ea == eb for (ea,eb) in zip(a,b)) >= 2
for el_a in results_a:
pmatch[el_a] = [el_b for el_b in results_b if partial_macth(el_a,el_b)]
返回那些不匹配的记录:
no_match = [el for el in results_a if el not in results_b]
-- 编辑 / 另一种可能的部分匹配
def partial_match(x,y):
nb_matches = sum(ea == eb for (ea,eb) in zip(x,y))
return 0.6 < float(nb_matches) / len(x) < 1