2

我正在将一个表与其自身进行比较,试图确定一条记录中的电子邮件是否正在另一条记录中的其他四个列中的任何一个中使用。

为了使这更容易,让我们看一个示例(简化):

Name: Bob
Office Email: bob@aaa.com
Home Email: bob@home.com
Mobile Email: bobster@gmail.com

.

Name: Rob
Office Email: rob@bbb.com
Home Email: bob@home.com
Mobile Email: robert@gmail.com

现在我有一个这样的sql语句:

select c1.ContactId id1, c1.FullName Name1, 'Office Email 1' EmailType1, c1.EMailAddress1 Email, 
   c2.ContactId id2, c2.FullName Name2, 
   CASE c1.EmailAddress1
    WHEN c2.EMailAddress1 THEN 'Office Email 1'
    WHEN c2.Si_OfficeEmail2nd THEN 'Office Email 2'
    WHEN c2.EMailAddress2 THEN 'Mobile Email'
    WHEN c2.pc_hmemail THEN 'Home Email'
    ELSE '?'
   END EmailType2,
   CASE c1.EmailAddress1
    WHEN c2.EMailAddress1 THEN c2.EMailAddress1
    WHEN c2.Si_OfficeEmail2nd THEN c2.Si_OfficeEmail2nd
    WHEN c2.EMailAddress2 THEN c2.EMailAddress2
    WHEN c2.pc_hmemail THEN c2.pc_hmemail
    ELSE '?'
   END DuplicateEmail
from Contact c1, Contact c2
where (
   LTRIM(RTRIM(c1.EMailAddress1 )) = LTRIM(RTRIM(c2.EMailAddress1))
Or LTRIM(RTRIM(c1.EMailAddress1 )) = LTRIM(RTRIM(c2.EMailAddress2))
Or LTRIM(RTRIM(c1.EMailAddress1 )) = LTRIM(RTRIM(c2.pc_hmemail))
Or LTRIM(RTRIM(c1.EMailAddress1 )) = LTRIM(RTRIM(c2.Si_OfficeEmail2nd))
)
And c1.ContactId <> c2.ContactId
And c1.StateCode = 0 
and c2.StateCode = 0
order by c1.FullName, c2.FullName

不幸的是,由于 Bob 和 Rob 具有相同的电子邮件“类型”(家庭电子邮件),但由于拼写错误而重复,我的查询返回两条记录,一条显示 Bobs 的电子邮件在 Rob 电子邮件中重复,另一条显示 Rob 的电子邮件是在 Bobs 电子邮件中重复。

我只需要一张唱片。我确信这是一个常见问题,但我不太清楚如何描述这个问题,以便让搜索引擎返回一些有用的东西。

也许有更好的方法来解决这个问题?如果没有,除了跳过一堆中间临时表来消除这些等效记录之外,有没有办法为此编写单个查询?

4

2 回答 2

1

您的问题的解决方案是添加条件: c1.contactId < c2.ContactId。这限制了您正在查看的对。

如果您正在查看电子邮件,您可能会找到一种更快的方法来直接查看电子邮件。类似以下内容将返回所有重复的电子邮件(在单独的行上):

select e.*
from (select e.*, COUNT(*) over (partition by email) as NumTimes
      from ((select contactId, 'Office' as which, EmailAddress1 as email
             from Contact
            ) union all
            (select contactId, 'Office2', Si_OfficeEmail2nd
             from Contact
            ) union all
            (select contact_id, 'Home', pc_hmemail
             from Contact
            ) union all
            (select contact_id, 'Mobile', EmailAddress2
             from Contact
            )
           ) e
      where email is not null and email <> ''
     ) e
where NumTimes > 1
order by email
于 2013-04-17T19:43:48.890 回答
0

我首先建议继续规范您的数据结构。一个人可能有几种类型的联系信息。因此,personID、typeID 和 value 可以放在另一个表中。从这个表中,您可以创建另一个与类型表的关系,您可以在其中跟踪不同的联系人类型(例如家庭电子邮件、工作电子邮件、Twitter、linkedIn、Facebook 等)。它不仅可以提高系统的可扩展性,还可以更有效地运行这些类型的查询。

SELECT user.username FROM user u LEFT JOIN contactinfo ci ON u.user_id=ci.user_id LEFT JOIN contacttype ct ON ci.type_id=ct.type_id GROUP BY ci.value HAVING count(value)>1将是查找任何重复源的查询

于 2013-04-17T19:45:28.853 回答