2010-10-26 81 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 + '%' 

我認爲......如果你在開始時沒有使用通配符,但在任何地方之後,它可以從索引中受益。如果您使用全文搜索,它也可以受益。