将两个表与其列进行比较

时间:2012-05-30 09:29:56

标签: sql-server tsql

我有两张桌子Table1& Table2都说了10列

我想将这两个表与每个列值进行比较,并选择仅列出匹配数超过三列的记录 ..

即,

Table1.Col1值与Table2.Col1值匹配 AND Table1.Col2值与Table2.Col2值匹配 AND Table1.Col3值与Table2.Col3值匹配

OR

Table1.Col2值与Table2.Col2值匹配 AND Table1.Col4值与Table2.Col4值匹配 AND Table1.Col6值与Table2.Col6值相匹配等等......

如何为此编写一个简单而智能的查询?

1 个答案:

答案 0 :(得分:2)

加入一个或条件,然后根据匹配的字段数进行过滤(我最多只能处理4个字段,根据需要添加多个字段)。

select *
from table1 t1
join table2 t2
  on t1.field1 = t2.field1 
  or t1.field2 = t2.field2
  or t1.field3 = t2.field3
  or t1.field4 = t2.field4
where 
   ( case when t1.field1 = t2.field1 then 1 else 0 end 
   + case when t1.field2 = t2.field2 then 1 else 0 end 
   + case when t1.field3 = t2.field3 then 1 else 0 end 
   + case when t1.field4 = t2.field4 then 1 else 0 end
   ) >= 3

如果你像我一样懒惰,你可以为这样的所有字段生成语句。

select 'select * ' union all
select '  from table1 t1' union all
select '  join table2 t2' union all
select '    on 1 = 1 ' union all
select '   and t1.' + t1.name + ' = t2.' + t2.name  from sys.columns t1 join sys.columns t2 on t1.name = t2.name where t1.object_id = object_id('table1') and t2.object_id = object_id('table2')
union all
select 'where ( 0' union all
select '   + case when t1.' + t1.name + ' = t2.' + t2.name + ' then 1 else 0 end ' from sys.columns t1 join sys.columns t2 on t1.name = t2.name where t1.object_id = object_id('table1') and t2.object_id = object_id('table2')
union all 
select '      ) >= 3'

(运行查询并复制粘贴结果。)