Sql server 将一个表的数据与另一个表的数据进行比较的最佳方法是什么?
我有两个精选语句:Sql server 将一个表的数据与另一个表的数据进行比较的最佳方法是什么?,sql-server,sql-server-2008,tsql,Sql Server,Sql Server 2008,Tsql,我有两个精选语句: 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') A
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
我只想从Customers表中选择不在EmailOptOuts表中的电子邮件。实现这一目标的最佳方式是什么?我考虑过使用游标和循环 绕过清理规则只是为了让下面的代码更干净,您可以这样做:
SELECT c.Email
FROM dbo.Customers c
WHERE NOT EXISTS(SELECT NULL
FROM [LifeMail].[dbo].[EmailOptOuts] o
WHERE c.Email = o.EmailOptOut)
您还可以执行以下操作:
SELECT Email
FROM dbo.Customers
WHERE Email NOT IN
( SELECT Email
FROM [LifeMail].[dbo].[EmailOptOuts]
)
我将把这些表放到临时表中,但是如果需要,可以组合查询
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个具有左连接的更多解决方案:
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)
SELECT Email
FROM dbo.Customers c
LEFT JOIN [LifeMail].[dbo].[EmailOptOuts] b ON (b.EmailOptOut = c.Email)
WHERE b.EmailOptOut IS NULL
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