SQL查询帮助 - 重复删除

时间:2011-01-10 22:23:19

标签: asp.net sql duplicates

不确定是将它放在软件中还是在这里,所以我想我会从这里开始我知道这将是一个直截了当的答案来自你的SQL天才......

我有一张桌子,它包含我每天导入的联系人。我将有一个用于用户交互的ASP.NET前端。从这张表中,我的目的是向他们发送所有邮件 - 但每个地址只有一个。所以我的最终结果是用户输入一个日期(对应于导入的日期),并且它们被赋予一个结果网格,该网格具有与该日期相关联的所有唯一地址。我只想将邮件发送到该地址一次 - 我的原始导入列表很多次会在同一地址包含多个商家。

表:ContactTable Fielsd: ID,公司名称,地址,城市,州,邮编,电话

我可以使用SELECT DISTINCT子句,但我需要与之关联的所有数据(公司名称等)

此表中有超过262000条记录。

如果我选择1月10日的样本日期,我会得到2401条记录。 SELECT DISTINCT同一天的地址给了我2092条记录。这是可行的,我会给那些2092人送邮件。

其次,我必须能够历史地检查邮件是否已经发送到该地址。我明天也不想再向另一家公司发送邮件。

我最好的方法是什么?

3 个答案:

答案 0 :(得分:1)

我首先要创建一个表来查找已发送的邮件程序。

ID | DateSent
-------------

每次发送邮件时,您都会想要将ID和日期时间插入其中,这样当您去拉邮件时,您可以查看此表以查看邮件是否已在任何内容中发送您指定的邮寄时限是。如果您有多种类型的邮件程序以包含邮件程序类型,则可以对此进行扩展。

普通旧SQL

SELECT a.ID, a.CompanyName, b.Address, b.City, b.State, b.Zip, a.Phone
FROM a.ContactTable
RIGHT JOIN (SELECT DISTINCT Address, City, State, Zip
            FROM ContactTable) b
ON a.ID = b.ID

这个子查询就像创建一个临时表,只选择DISTINCT地址,然后将其加入其余信息。

要针对新表添加查找,请添加以下内容

SELECT a.ID, a.CompanyName, b.Address, b.City, b.State, b.Zip, a.Phone
FROM a.ContactTable
RIGHT JOIN (SELECT DISTINCT Address, City, State, Zip
            FROM ContactTable) b
ON a.ID = b.ID
RIGHT JOIN SentMailer c
ON a.ID = c.ID 

<击>

WHERE DATEDIFF(mm, c.DateSent, GETDATE()) > 12 --gives you everything that hasn't been sent a mailer within the last year

修改

如果没有数据标准化,很难获得高质量的结果。我在过去发现了更多创意我必须得到的查询是错误的表结构或数据收集的标志。我认为你仍然应该为ID / DateSent创建一个查找表来管理发送的时间范围。

修改

  

是的,我基本上都在寻找独特的地址,城市,州,邮编。我只需要为每个地址设置一个实例,这样我们就可以将邮件发送到该地址。此时,不需要公司名称。

如果是这种情况,您只需执行以下操作:

SELECT DISTINCT Address, City, State, Zip, Phone
FROM ContactTable

请注意,这不会清除Main Street vs Main St.

等条目

答案 1 :(得分:1)

RogueSpear,我在SmartyStreets的地址验证(以及重复数据删除)字段中工作,在那里我们经常处理这个场景并应对挑战。

如果您从公司获取每日列表并拥有数十万条记录,那么使用存储过程或单纯查询删除重复地址将不足以匹配每个地址的不同可能性。那里有 服务,我会指向那些提供此服务的CASS认证供应商。

您可以使用CASS-Certified Scrubbing之类的内容标记表格中的重复项,或者您可以使用LiveAddress之类的API阻止重复项的输入。无论如何,我很乐意亲自帮助您处理任何其他地址问题。

答案 2 :(得分:0)

我会选择,然后删除这样的重复项:

SELECT  a.ID, a.PurgedID, a.CAMPAIGNTYPE, a.COMPANY, a.DBANAME, a.COADDRESS, a.COCITY, a.COSTATE, a.COZIP, a.FIRSTNAME1, a.DIALERPHONENUM, a.Purged FROM PurgeReportDetail a
WHERE EXISTS (
    SELECT * FROM PurgeReportDetail b WHERE
    b.COADDRESS = a.COADDRESS
    AND b.COCITY = a.COCITY
    AND b.COSTATE = a.COSTATE
    AND b.COZIP = a.COZIP
    AND b.id <> a.id
    ) -- This clause will only include rows with duplicate columns noted
AND a.ID IN (
    SELECT TOP 1 c.ID from PurgeReportDetail c 
    WHERE c.COADDRESS = a.COADDRESS
    AND c.COCITY = a.COCITY
    AND c.COSTATE = a.COSTATE
    AND c.COZIP = a.COZIP
    ORDER BY c.ID -- If you want the *newest* entry to be saved, add "DESC" here
    ) -- This clause gets the top 1 ID value for each matching set

或类似的东西。 这将保留冗余地址的第一个ID,只需在准备好时将SELECT替换为DELETE

编辑:当然这只适用于完全匹配。

EDIT2:如果您只想检查您没有发送邮件的位置,您应该同时加入指定日期范围内的已发送邮件的表格