我一直在试图找出编写查询来比较两个表中的行的最佳方法。我的目标是查看结果集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 中的 tuple2 与 results_b 中的 tuple2 进行比较)。它更像是(比较 results_a 中的 tuple2 并查看它是否与 results_b 中的任何记录匹配。如果主键匹配并且结果 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)} 因为这些是唯一不同的集合。有什么想法吗?
最佳答案
获取 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]
--编辑/另一个可能的partial_match
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
关于python - SQLite 比较查询 Python,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7704677/