Sql 在任意一列中查找重复项
我有一段代码,它根据以下事实来识别潜在的重复记录:若干行(具有不同的ID)在不同的其他列中具有相同的值。这些信息会被手动审查,因此我并不担心丈夫和妻子可以合法地共享电子邮件地址。我使用的查询示例如下: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
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在这里是一个列别名:)哦,我的错,但这就是为什么您应该使用作为
;)当然……从现在开始我会的。我不得不稍微调整一下,但这为我指明了正确的方向,而且效率惊人!非常感谢。