SQLite 比较查询 Python

1 投票
1 回答
825 浏览
提问于 2025-04-17 03:59

我一直在想怎么写一个查询,来比较两个表中的行。我的目标是看看结果集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 个回答

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

撰写回答