我正在比较一个表与自己,试图确定一个记录中的电子邮件是否正在其他记录中的其他四个列中的任何一个中使用。用于不同记录比较的Sql
为了更方便,让我们来看一个例子(简体):
Name: Bob
Office Email: [email protected]
Home Email: [email protected]
Mobile Email: [email protected]
。
Name: Rob
Office Email: [email protected]
Home Email: [email protected]
Mobile Email: [email protected]
现在我有一个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
不幸的是,因为鲍勃和Rob有相同的电子邮件“类型”(主页电子邮件)因复制到一个错字,我的查询返回两条记录,其中一条显示鲍勃斯电子邮件在Robs电子邮件中被复制,另一个Robs电子邮件被复制到鲍勃斯电子邮件中。
我只需要一条记录。我确定这是一个常见问题,但我不太清楚如何描述这个问题,以便让搜索引擎返回一些有用的信息。
也许有更好的方法去做这件事?如果不是,除了跳过一堆中间临时表以消除这些等效记录外,是否有办法为此编写单个查询?
如果能够正常化你的数据库,这样做。联系人和电子邮件地址之间的一对多关系是适当的。然后,您可以对电子邮件地址和类型进行独特的限制。另外,如果Bob和Rob真的拥有相同的家庭电子邮件呢?我和我的妻子呢。 –
不幸的是,我无法正常化数据库,我正在使用MS CRM 2011,这些电子邮件是股票(除了一个,但在这一点上是无关紧要的)。 – Bitfiddler