加入两个表并返回共同具有N个值的行

时间:2014-02-20 16:46:29

标签: sql join

我有两个我合并的架构相同的数据库,现在我想返回可能匹配的记录。

即,在更新的数据库中返回可能如下所示的三条记录:

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'值。

我知道它应该是一个内部联接但我的问题是我希望它能够返回任何具有任何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的记录,这太慢了!有更快的方法吗?

2 个答案:

答案 0 :(得分: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。在其他数据库中,您必须重复case子句中的where语句或使用子查询。

答案 1 :(得分:0)

我怀疑你会找到任何捷径......你需要拼出你想要的所有比赛,即:

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