2011-11-09 24 views
1

好了,所以我有2個選擇語句:將表格數據與另一個表格數據進行比較的最佳方式是什麼?

SELECT DISTINCT Email 
FROM   dbo.Customers 
WHERE  (Email IS NOT NULL) 
AND (Email LIKE '%@%') 
AND (RIGHT(Email, 4) IN ('.net', '.com', '.org')) 
AND (Email NOT LIKE '%@UniformCity.com') 
AND (Email NOT LIKE '%@LifeUniform.com') 
AND (CHARINDEX('.',Email) <> 1) 
AND (RIGHT(RTRIM(Email), 1) <> '.') AND (LEFT(LTRIM(Email), 1) <> '@') 
AND (Email not Like '%[`:;_*-,^[^]()+%\/=#-]%' escape '^') order by Email 

SELECT replace(replace(
replace(
replace(EmailOptOut,'"','') 
, ',held','') 
, ',unsub','') 
, ',confirm','') 
as CleanEmail 
FROM [LifeMail].[dbo].[EmailOptOuts] 

我只想選擇Customers表中的電子郵件,這在EmailOptOuts表都沒有。什麼是達到這個目標的最好方法?我想過使用遊標和循環,但我相信你的專家知道更好的方法。

回答

2

我要去把這些表放到臨時表中,但是如果你願意,你可以組合這些查詢。

SELECT DISTINCT Email 
INTO #tCustomersEmail 
FROM dbo.Customers 
WHERE (Email IS NOT NULL) 
    AND (Email LIKE '%@%') 
    AND (RIGHT(Email, 4) IN ('.net', '.com', '.org')) 
    AND (Email NOT LIKE '%@UniformCity.com') 
    AND (Email NOT LIKE '%@LifeUniform.com') 
    AND (CHARINDEX('.', Email) <> 1) 
    AND (RIGHT(RTRIM(Email), 1) <> '.') 
    AND (LEFT(LTRIM(Email), 1) <> '@') 
    AND (Email NOT LIKE '%[`:;_*-,^[^]()+%\/=#-]%' ESCAPE '^') 
ORDER BY Email 

SELECT REPLACE(REPLACE(REPLACE(REPLACE(EmailOptOut, '"', ''), ',held', ''),',unsub', ''), ',confirm', '') AS CleanEmail 
INTO #tOptOuts 
FROM [LifeMail].[dbo].[EmailOptOuts] 

SELECT Email 
FROM #tCustomersEmail AS tce 
WHERE Email NOT IN (SELECT CleanEmail FROM #tOptOuts AS too) 
3

繞過您的清理規則只是讓下面的代碼更乾淨,你可以做這樣的事情:

SELECT c.Email 
    FROM dbo.Customers c 
    WHERE NOT EXISTS(SELECT NULL 
         FROM [LifeMail].[dbo].[EmailOptOuts] o 
         WHERE c.Email = o.EmailOptOut) 
1

你也可以做到以下幾點:

SELECT Email  
FROM dbo.Customers  
WHERE Email NOT IN 
    (SELECT Email       
     FROM [LifeMail].[dbo].[EmailOptOuts]       
    ) 
1

1更溶液(用LEFT JOIN):

SELECT Email  
FROM dbo.Customers c 
LEFT JOIN [LifeMail].[dbo].[EmailOptOuts] b ON (b.EmailOptOut = c.Email) 
WHERE b.EmailOptOut IS NULL 
1
SELECT qCustomerEmail.Email 
FROM 
    (SELECT DISTINCT Email 
    FROM   dbo.Customers 
    WHERE  (Email IS NOT NULL) 
    AND (Email LIKE '%@%') 
    AND (RIGHT(Email, 4) IN ('.net', '.com', '.org')) 
    AND (Email NOT LIKE '%@UniformCity.com') 
    AND (Email NOT LIKE '%@LifeUniform.com') 
    AND (CHARINDEX('.',Email) <> 1) 
    AND (RIGHT(RTRIM(Email), 1) <> '.') AND (LEFT(LTRIM(Email), 1) <> '@') 
    AND (Email not Like '%[`:;_*-,^[^]()+%\/=#-]%' escape '^')) qCustomerEmail 
LEFT JOIN 
    (SELECT replace(replace(
    replace(
    replace(EmailOptOut,'"','') 
    , ',held','') 
    , ',unsub','') 
    , ',confirm','') 
    as CleanEmail 
    FROM [LifeMail].[dbo].[EmailOptOuts]) qOptOut 
ON qCustomerEmail.Email = qOptOut.CleanEmail 
WHERE qOptOut.CleanEmail IS NULL 
相關問題