我有两个我合并的架构相同的数据库,现在我想返回可能匹配的记录。
即,在更新的数据库中返回可能如下所示的三条记录:
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的记录,这太慢了!有更快的方法吗?
答案 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, ...