2014-02-20 43 views
0

我有兩個數據庫具有相同的模式,我合併,現在我想返回可能匹配的記錄。加入兩個表並返回N個共同的行

也就是說,返回三個記錄在更新的數據庫可能看起來像:

id  foo  bar  baz  meow  mix 
36  123  234       567 
962  123     345  456  567 
962       345 

我希望能夠搜索具有任何共同的n個列值的記錄(其中n = 2明顯) 。在這個例子中,記錄1和2具有相同的'foo'和'mix'值,記錄2和3具有相同的'id'和'bad'值。

我知道它應該是一個INNER JOIN,但我的問題是我希望它能夠返回任何具有任何n列值的記錄,所以我不知道要將它們連接在一起。

SELECT * FROM table t1 INNER JOIN table t2 ON ... 

任何幫助將不勝感激!

附錄:

@Gordon Linoff

好吧,這工作!我將它概括爲任意表格和任意列數,並排除與之相同的匹配項:

"SELECT t1.*, t2.* FROM {0} t1 JOIN {0} t2 ON {1} WHERE ({2}) BETWEEN 2 AND {3}".format(table, ' or '.join(['t1.{0}=t2.{0}'.format(c) for c in columns]), '+'.join(['(CASE WHEN t1.{0}=t2.{0} THEN 1 ELSE 0 END)'.format(c) for c in columns]),len(columns)-1) 

謝謝!

更新:我正在改革這個表上有〜10K記錄,這太慢了!有沒有更快的方法來做到這一點?

+0

這可能是一個好主意,建立功能採取5個參數和返回對數。然後通過將函數放入WHERE子句中,再次運行該函數的每一行。 – huhu78

+0

@ huhu78這是什麼樣子? –

+0

僞代碼函數:int f(arg1,arg2,arg3,arg4,arg5){比較所有內容,計數對,返回對};然後在查詢中:SELECT id FROM tab1 WHERE f(col1,col2,col3,col4,col5)> = n;函數的使用可能更具可讀性,更可重用,只需幾步就可以編寫函數的機會 – huhu78

回答

2

你可以做到這一點自聯接和order by

select t1.*, t2.*, 
     ((case when t1.id = t2.id then 1 else 0 end) + 
     (case when t1.foo = t2.foo then 1 else 0 end) + 
     (case when t1.bar = t2.bar then 1 else 0 end) + 
     . . . 
     ) as NumMatches   
from table t1 join 
    table t2 
    on t1.id = t2.id or 
     t1.foo = t2.foo or 
     t1.bar = t2.bar or 
     . . . 
order by NumMatches desc; 

如果你想要的是兩個或更多的比賽,那麼這取決於數據庫。在MySQL中,你可以說having NumMatches >= 2。在其他數據庫中,您必須重複where子句中的case語句或使用子查詢。

0

我懷疑你會發現任何快捷方式......你會需要拼出你想要的所有比賽,即:

SELECT * FROM table WHERE foo=bar or foo=baz or foo=meow or foo=mix, ... 
+0

我不想匹配foo和bar等。你的意思是'WHERE t1.foo = t2.foo OR t1.bar = t2 .bar'我假設。但這是荒謬的,因爲我不得不寫出每個可能的排列以匹配多個列,即「WHERE(t1.foo = t2.foo AND t1.bar = t2.bar)OR(t1.foo = t2.foo AND t1.baz = t2.baz)「等 –

相關問題