日期:2014-05-17  浏览次数:20363 次

请教个数据库判断重复的问题。
student表中有4个电话字段,phone1,phone2,phone3,phone4,在录入学生的时候,要求这四个号码都不存在数据库中,才可以录入。
现在有个导入功能,要求把重复的记录返回,不重复的导入数据库。我从excel中读取数据,因为数据库比较大,我首先存到临时表中,想在临时表中判断,把重复的记录筛选出来,不重复的导入数据库。
临时表中的phone1,phone2,phone3,phone4要和学生表中的4个号码字段判断,这个sql怎么写,求助大家。
数据库 excel sql 判断重复 大数据导入

------解决方案--------------------
select *
from tb a
where not exists (select 1 from tb b where a.phone1<>b.phone1 and a.phone2<>b.phone2 and 
 a.phone3<>b.phone3 and a.phone4<>b.phone4)

这个是任何一个重复都不会导进去的。
------解决方案--------------------
类似#2楼,如果非顺序匹配,努力OR就是了,有点悲催,横向设计的弊端,不写了。
------解决方案--------------------
引用:
引用:select *
from tb a
where not exists (select 1 from tb b where a.phone1<>b.phone1 and a.phone2<>b.phone2 and 
 a.phone3<>b.phone3 and a.phone4<>b.phone4)

这个是任何……


4个合成一个字段建上主键就OK了。 要是分开是iphone几,就加个分类字段即可。 
------解决方案--------------------
我觉得你可以先把表中phone字段合并成一个临时表,然后与导入的临时表比较

select phone1 as phone into #t from tb
union all select phone2 from tb
union all select phone3 from tb
union all select phone4 from tb

create clustered index pk_ix_#t_phone on #t(phone)

select phone1 as phone into #t1 from #insert
union all select phone2 from #insert
union all select phone3 from #insert
union all select phone4 from #insert

create clustered index pk_ix_#t1_phone on #t1(phone)

select a.phone into #p from #t a,#t1 b where a.phone=b.phone

create clustered index pk_ix_#p_phone on #p(phone)
--直接写not in效率应该很低,分开比较好,过滤掉大部分的话应该好一点
select * from #insert where phone1 not in (select phone from #p)
and phone2 not in (select phone from #p)
and phone3 not in (select phone from #p)
and phone4 not in (select phone from #p)
------解决方案--------------------


--先来一个全列表
WITH num
as
( SELECT    iphone1 AS num
          FROM      TB
          UNION
          SELECT    iphone2 AS num
          FROM      TB
          UNION
          SELECT    iphone3 AS num
          FROM      TB