Sql 在任意一列中查找重复项

Sql 在任意一列中查找重复项,sql,sql-server,Sql,Sql Server,我有一段代码,它根据以下事实来识别潜在的重复记录:若干行(具有不同的ID)在不同的其他列中具有相同的值。这些信息会被手动审查,因此我并不担心丈夫和妻子可以合法地共享电子邮件地址。我使用的查询示例如下: SELECT DISTINCT ID, Email FROM Customers WHERE Email IS NOT NULL AND Email != '' AND Email IN (SELECT Email FROM Customers GROUP BY Email HAVIN

我有一段代码,它根据以下事实来识别潜在的重复记录:若干行(具有不同的ID)在不同的其他列中具有相同的值。这些信息会被手动审查,因此我并不担心丈夫和妻子可以合法地共享电子邮件地址。我使用的查询示例如下:

SELECT DISTINCT ID, Email 
FROM Customers 
WHERE Email IS NOT NULL AND Email != '' AND Email IN
    (SELECT Email FROM Customers GROUP BY Email HAVING COUNT(DISTINCT ID) > 1) 
ORDER BY Email;
这给了我这样的结果:

ID       Email
108      bob@hotmail.com
381      bob@hotmail.com
205      mary@gmail.com
772      mary@gmail.com
908      mary@gmail.com
这对我来说非常有用,除非我尝试通过电话号码匹配,电话号码有多列(家庭电话、商务电话、手机)。这就产生了两个问题——第一个问题已经在本论坛上得到了很好的记录,即如何识别三列中任何一列包含匹配值的行(如果[1行a、B或C列]中的值与[2行a、B或C列]中的列匹配,那么我想选择这两行)。第二个问题是如何选择[ID],[Value that Matched]作为我的输出,我还没有弄清楚,也没有找到答案


我想我可以选择所有三列,在我的程序中做一些进一步的代码魔术来理解它,但这阻止了我重用现有代码,而且似乎也是开发人员用来阻止承认他需要DBA帮助的黑客类型。(帮助!)尽管如此,我仍在认真地寻找一个优雅的解决方案,我们将不胜感激。

基于我对这个问题的理解

您可以首先使用
union all
,将不同的电话号码放入一列,然后按该列进行分组,以查看是否有重复的电话号码。此后,
在原始表上加入
,以获取客户id

with cnts as (
      select phone 
      from (select id,homephone phone from customers
            union all
            select id,businessphone from customers
            union all
            select id,cellphone from customers) x
      group by phone
      having count(distinct id) > 1
    )
select c.id,cn.phone value_matched
from customers c
join cnts cn on cn.phone in (c.homephone,c.businessphone,c.cellphone)     
order by 1,2

我将使用
apply

select c.*, phone
from (select c.*, count(*) over (partition by phone) as cnt
      from customers c cross apply
           (select distinct v.phone
            from (values (homephone), (businessphone), (cellphone)
                 ) v(phone)
            where v.phone is not null
           ) v(phone)
     ) c
where cnt > 1
order by phone;

最里面的子查询为每个客户选择不同的电话。
计数(*)超过
然后统计
手机出现的次数
(这是因为不同的客户使用不同的密码)。最后的
,其中
选择为多个客户显示的电话。

您能显示一些示例数据和电话号码不匹配的预期结果吗?@RyanVincent-我同意这一点,在数据库规范化方面,但在这种情况下,我正在使用我继承的表…+1以获得正确的输出和优雅的解决方案,但是在测试了两者之后,交叉应用程序的运行速度似乎要快得多,所以我将正确答案授予Gordon。不过,谢谢你的回答
homephone电话
有一个额外的电话,或者您想添加另一个字段?@JuanCarlosOropeza。。phone在这里是一个列别名:)哦,我的错,但这就是为什么您应该使用
作为
;)当然……从现在开始我会的。我不得不稍微调整一下,但这为我指明了正确的方向,而且效率惊人!非常感谢。