2010-10-26 63 views
3

选择带有子记录我有这样的两个表:从另一个表

data  
id |email  
_ 
1 |[email protected]  
2 |[email protected]  
3 |zzzgimail.com 

errors  
_  
error |correct  
@gmial.com|@gmail.com  
gimail.com|@gmail.com  

如何从data所有记录与电子邮件错误选择?谢谢。

+0

我们爱SQL问题! – 2010-10-26 21:10:30

+0

yey!我希望这会很快得到提升... http://area51.stackexchange.com/proposals/4260/databases?referrer=diRC8jcl2i-5LIh8JGLLjA2 – 2010-10-26 21:31:31

回答

1
SELECT d.id, d.email 
FROM data d 
    INNER JOIN errors e ON d.email LIKE '%' + e.error 

会做,但是做一个像一个通配符的价值正在被匹配上将会阻止索引开始从使用,所以你可能会看到糟糕的表现。

最佳方法是在数据表上定义一个计算列,即电子邮件字段的REVERSE并将其编入索引。这将在结束时打开上述查询成LIKE条件与通配符像这样:

SELECT d.id, d.email 
FROM data d 
    INNER JOIN errors e ON d.emailreversed LIKE REVERSE(e.error) + '%' 

在这种情况下,性能会更好,因为这将允许使用的索引。

我在这个方法a while ago here上写了一篇完整的文章。

+0

,这个效果更好。 – 2010-10-26 21:25:22

0

那么,在现实中,你不能与你提供的信息。

在SQL中,您需要维护一个“正确”域的表。有了这个,你可以做一个简单的查询来查找不匹配。

您可以在SQL Server中使用一些“非”SQL功能来执行正则表达式检查,但SQL(IMO)中不会出现这种类型的逻辑。

1

假设错误总是在字符串的结尾:

declare @data table (
    id int, 
    email varchar(100) 
) 

insert into @data 
    (id, email) 
    select 1, '[email protected]' union all 
    select 2, '[email protected]' union all 
    select 3, 'zzzgimail.com' 

declare @errors table (
    error varchar(100), 
    correct varchar(100) 
) 

insert into @errors 
    (error, correct) 
    select '@gmial.com', '@gmail.com' union all 
    select 'gimail.com', '@gmail.com' 

select d.id, 
     d.email, 
     isnull(replace(d.email, e.error, e.correct), d.email) as CorrectedEmail 
    from @data d 
     left join @errors e 
      on right(d.email, LEN(e.error)) = e.error 
+0

抱歉乔,我不得不改变我接受的回应,但我给了你一个投票,希望你不介意 – 2010-10-26 21:26:29

+1

@eiefai:没问题。感谢adathedev – 2010-10-26 21:30:56

0
select * from 
(select 1 as id, '[email protected]' as email union 
select 2 as id, '[email protected]' as email union 
select 3 as id, 'zzzgimail.com' as email) data join 

(select '@gmial.com' as error, '@gmail.com' as correct union 
select 'gimail.com' as error, '@gmail.com' as correct) errors 

on data.email like '%' + error + '%' 

我认为......如果你在开始时没有使用通配符,但在任何地方之后,它可以从索引中受益。如果您使用全文搜索,它也可以受益。