Каков наилучший способ сравнить данные таблиц с другими? - PullRequest
1 голос
/ 09 ноября 2011

Хорошо, у меня есть 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]

Я хочу выбрать только электронные письма из таблицы «Клиенты», ЭТОГО НЕТ в таблице EmailOptOuts.Каков наилучший способ достичь этого?Я думал об использовании курсоров и циклов, но я уверен, что вы, эксперты, знаете лучший способ.

Ответы [ 5 ]

3 голосов
/ 09 ноября 2011

Обходя ваши правила очистки только для того, чтобы код ниже был чище, вы можете сделать что-то вроде этого:

SELECT c.Email
    FROM dbo.Customers c
    WHERE NOT EXISTS(SELECT NULL
                         FROM [LifeMail].[dbo].[EmailOptOuts] o
                         WHERE c.Email = o.EmailOptOut)
2 голосов
/ 09 ноября 2011

Я собираюсь поместить эти таблицы во временные таблицы, но вы можете объединить запросы, если хотите.

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)
1 голос
/ 09 ноября 2011
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
1 голос
/ 09 ноября 2011

Еще 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 голос
/ 09 ноября 2011

Вы также можете сделать следующее:

SELECT Email     
FROM dbo.Customers      
WHERE Email NOT IN 
    ( SELECT Email                          
      FROM [LifeMail].[dbo].[EmailOptOuts]                          
    ) 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...