跨表进行模糊查询的问题

drifter250771 2007-09-28 04:21:48
表结构如下
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中的符合匹配条件各一条记录。
...全文
179 1 打赏 收藏 转发到动态 举报
写回复
用AI写文章
1 条回复
切换为时间正序
请发表友善的回复…
发表回复
dobear_0922 2007-09-28
  • 打赏
  • 举报
回复
--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)+ '_' + 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)+ '_'
)

27,579

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 应用实例
社区管理员
  • 应用实例社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧