日期:2014-05-18  浏览次数:20662 次

跨表进行模糊查询的问题
表结构如下
table1:
字段1=姓名、字段2=身份证号码、字段3=住址、字段4=.....
table2:
字段1=姓名、字段2=身份证号码、字段3=住址、字段4=.....

想通过数据库查询语言得出两表中身份证号码相似的记录,比如现在有个具体要求,将两表中身份证号码只相差一位(“第1位-第18位 ",任意一个位置存在差异都可以)的记录列举出来。

select   *   from   table111   where   right(字段2,17)   in   (select   right(字段2,17)   from   table2)
select   *   from   table111   where   left(字段2,1)+right(字段2,16)   in   (select   left(字段2,1)+right(字段2,16)   from   table2)
select   *   from   table111   where   left(字段2,2)+right(字段2,15)   in   (select   left(字段2,2)+right(字段2,15)   from   table2)
.....
select   *   from   table111   where   left(字段2,15)+right(字段2,2)   in   (select   left(字段2,15)+right(字段2,2)   from   table2)
select   *   from   table111   where   left(字段2,16)+right(字段2,1)   in   (select   left(字段2,16)+right(字段2,1)   from   table2)
select   *   from   table111   where   left(字段2,17)   in   (select   left(字段2,17)   from   table2)

上面18条语句只能分别对“第1位-第18位”指定一个位置上存在差异的记录进行单独查询,有重复不说(身份证号码完全一样的记录将出现在18次查询中的每一次),而且只能得到table1中的匹配记录,无法得到table2中的被匹配记录。

有没有办法将两表中只相差1位的记录一次输出,每一次的匹配作为一个单元:包括table1和table2中的符合匹配条件各一条记录。

------解决方案--------------------
--try(楼主确信所有的身份证都是18位的?)
select * from table1 T1
where exists(
select 1 from table2 T2 where 身份证号码 like '_ ' + right(T1.身份证号码,17)
or 身份证号码 like left(T1.身份证号码,1)+ '_ ' + right(T1.身份证号码,16)
or 身份证号码 like left(T1.身份证号码,2)+ '_ ' + right(T1.身份证号码,15)
or 身份证号码 like left(T1.身份证号码,3)+ '_ ' + right(T1.身份证号码,14)
or 身份证号码 like left(T1.身份证号码,4)+ '_ ' + right(T1.身份证号码,13)
or 身份证号码 like left(T1.身份证号码,5)+ '_ ' + right(T1.身份证号码,12)
or 身份证号码 like left(T1.身份证号码,6)+ '_ ' + right(T1.身份证号码,11)
or 身份证号码 like left(T1.身份证号码,7)+ '_ ' + right(T1.身份证号码,10)
or 身份证号码 like left(T1.身份证号码,8)+ '_ ' + right(T1.身份证号码,9)
or 身份证号码 like left(T1.身份证号码,9)+ '_ ' + right(T1.身份证号码,8)
or 身份证号码 like left(T1.身份证号码,10)+ '_ ' + right(T1.身份证号码,7)
or 身份证号码 like left(T1.身份证号码,11)+ '_ ' + right(T1.身份证号码,6)
or 身份证号码 like left(T1.身份证号码,12)+ '_ ' + right(T1.身份证号码,5)
or 身份证号码 like left(T1.身份证号码,13)+ '_ ' + right(T1.身份证号码,4)
or 身份证号码 like left(T1.身份证号码,14)+ '_ ' + right(T1.身份证号码,3)
or 身份证号码 like left(T1.身份证号码,15)+ '_ ' + right(T1.身份证号码,2)
or 身份证号码 like left(T1.身份证号码,16)+ '_ ' + right(T1.身份证号码,1)
or 身份证号码 like left(T1.身份证号码,17)+ '_ '
)
union all
select * from table2 T1
where exists(
select 1 from table1 T2 where 身份证号码 like '_ ' + right(T1.身份证号码,17)
or 身份证号码 like left(T1.身份证号码,1)+ '_ ' + right(T1.身份证号码,16)
or 身份证号码 like left(T1.身份证号码,2)+ '_ ' + right(T1.身份证号码,15)
or 身份证号码 like left(T1.身份证号码,3)+ '_ ' + right(T1.身份证号码,14)
or 身份证号码 like left(T1.身份证号码,4)+ '_ ' + right(T1.身份证号码,13)
or 身份证号码 like left(T1.身份证号码,5)+ '_ ' + right(T1.身份证号码,12)
or 身份证号码 like left(T1.身份证号码,6)+ '_ ' + right(T1.身份证号码,11)
or 身份证号码 like left(T1.身份证号码,7)+ '_ ' + right(T1.身份证号码,10)
or 身份证号码 like left(T1.身份证号码,8)+ '_ ' + right(T1.身份证号码,9)
or 身份证号码 like left(T1.身份证号码,9)+ '_ ' + right(T1.身份证号码,8)
or 身份证号码 like left(T1.身份证号码,10)+ '_ ' + right(T1.身份证号码,7)
or 身份证号码 like left(T1.身份证号码,11)+ '_ ' + right(T1.身份证号码,6)
or 身份证号码 like left(T1.身份证号码,12)+