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

SQL 两表关联,关联时取一字段的一部分做链接,求方法
如下面:
需要找出,#c中以#b表中domain为结尾的记录,数据量大希望有比较好的代码:
即找出:
1@abc.com
12@a.com
3@@b.com

create table #c(email varchar(10))
insert into #c values ('1@abc.com')
insert into #c values ('12@a.com')
insert into #c values ('3@@b.com')
insert into #c values ('123@d.com')
insert into #c values ('1@sina.com')

create table #b(domain varchar(10))
insert into #b values('abc.com')
insert into #b values('a.com')
insert into #b values('b.com')

select *
from #c
where RIGHT(email,len(email)-CHARINDEX('@',email,1)) in (select domain from #b)

------最佳解决方案--------------------
经过两位大神的引导,出来了一版。用join链接表,提高效能。
create table #c(email varchar(10))
insert into #c values ('1@abc.com')
insert into #c values ('12@a.com')
insert into #c values ('3@@b.com')
insert into #c values ('123@d.com')
insert into #c values ('4@b.com')
insert into #c values ('123@@A.com')
insert into #c values ('1@sina.com')
  
create table #b(domain varchar(10))
insert into #b values('abc.com')
insert into #b values('a.com')
insert into #b values('b.com')
  

select c.email
from #c c left join #b b on c.email like '%@'+b.domain
where b.domain is not null


------其他解决方案--------------------
create table #c(email varchar(10))
insert into #c values ('1@abc.com')
insert into #c values ('12@a.com')
insert into #c values ('3@@b.com')
insert into #c values ('123@d.com')
insert into #c values ('1@sina.com')
 
create table #b(domain varchar(10))
insert into #b values('abc.com')
insert into #b values('a.com')
insert into #b values('b.com')
 
select *
from #c
where exists(select 1 from #b where #c.email like '%@'+domain)
/*
email
1@abc.com
12@a.com
3@@b.com
*/

------其他解决方案--------------------
对字符串做这样的操作,其实无可避免性能底下。
--create table #c(email varchar(10))
 --insert into #c values ('1@abc.com')
 --insert into #c values ('12@a.com')
 --insert into #c values ('3@@b.com')
 --insert into #c values ('123@d.com')
 --insert into #c values ('1@sina.com')
  
 --create table #b(domain varchar(10))
 --insert into #b values('abc.com')
 --insert into #b values('a.com')
 --insert into #b values('b.com')
  
 SELECT  *
 FROM    #c
 WHERE   EXISTS ( SELECT 1
                  FROM &nbs