2011-10-09 113 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