2011-10-09 59 views
1

我一直在想出编写查询来比较两个表中的行的最佳方法。我的目标是查看结果集A中的两个元组是否在较大的结果集B中。我只想查看查询结果中不同的元组。SQLite比较查询Python

'''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中的第二个元组。

最终我想返回一个集合,它也有另一个集合中不匹配的第二个元组,所以我可以在我的程序中引用它们。理想情况下,由于第二个元组主键(表1中的field_b)与表2中的对应主键(field_a)不匹配,我想要显示results_c = {(121212121,22222222,9999999999):(121212121,22222222,999999999)} 。这很复杂,因为这两个表中的结果不会以相同的顺序排列,所以我不能编写说明(将results_a中的tuple2与result_b中的tuple2进行比较)的代码。它更像(比较results_a中的tuple2并查看它是否与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) 

OUTPUT = {(4,5,7):[(4,5,6)],(1,2,3):[(1,2 ,3)]}。我预料它只是{(4,5,7):(4,5,6)},因为这些是唯一不同的集合。有任何想法吗?

回答

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 
+0

谢谢。我仍然围绕着语言的列表理解特征,但我认为这将起作用。 –

+0

我一直在这里呆了一个小时,但仍然无法使部分匹配功能正常工作。当我尝试使用列表理解调用partial_match()时,我一直在获得最大递归达到的错误。有任何想法吗? –

+1

我不认为这个函数应该是递归的...你可以告诉我们在你的问题结束时的函数定义吗? – log0