读书人

SQL 两表联系关系关联时取一字段的一

发布时间: 2012-12-15 15:16:03 作者: rapoo

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 #b


WHERE REVERSE(SUBSTRING(REVERSE(email), 1,
PATINDEX('%@%', REVERSE(email)) - 1)) = #b.DOMAIN )


/*
email
----------
1@abc.com
12@a.com
3@@b.com

(3 行受影响)

*/


[其他解释]
大版又出来了...
[其他解释]
null

读书人网 >SQL Server

热点推荐