我一直在试图找出编写查询以比较两个表中的行的最佳方法。我的目标是查看结果集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,2222222222,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)
OUTPUT = {(4,5,7):[(4,5,6)],(1,2,3):[(1,2,3)]}。我原以为它只是{(4,5,7):( 4,5,6)}因为那些是唯一不同的集合。有什么想法吗?
答案 0 :(得分:1)
获取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