在Oracle中用SQL获取重复元组:关联多表地址字段的问题
调整SQL关联表2并加入address检查的方案
我来帮你搞定这个需求!你现在需要找出姓名(Fname+Lname)、邮箱相同,但电话不同的重复客户,同时还要把表2的address字段加进来,并且对address应用和电话一样的重复检查逻辑(也就是同姓名邮箱下address也不同)对吧?
首先明确下关联逻辑:假设表S_CONTACT(表1)和t2(表2)是通过Fname和Lname来关联的(如果实际是用主键关联,你可以把JOIN条件换成对应的主键字段就行)。
下面是修改后的SQL语句,既关联了表2的address,又满足了你要的重复检查条件:
SELECT A."Fname"||' '||A."Lname" AS "Customer_Name", A."EMAIL", T1."address", COUNT(*) AS "Countof" FROM "S_CONTACT" A -- 关联表2,获取当前客户的address JOIN "t2" T1 ON A."Fname" = T1."Fname" AND A."Lname" = T1."Lname" WHERE EXISTS ( SELECT 1 FROM "S_CONTACT" B -- 子查询里也关联表2,获取对比客户的address JOIN "t2" T2 ON B."Fname" = T2."Fname" AND B."Lname" = T2."Lname" WHERE A."PHONE" != B."PHONE" AND A."Fname" = B."Fname" AND A."EMAIL" = B."EMAIL" AND A."Lname" = B."Lname" AND A."DOB" IS NULL -- 加上address的不同条件,和phone的检查逻辑一致 AND T1."address" != T2."address" ) -- 分组时要包含address,保证统计的准确性 GROUP BY A."Fname", A."Lname", A."EMAIL", T1."address" HAVING COUNT(*) > 1;
如果你的需求只是把address字段展示出来,不需要检查address是否不同,那可以去掉子查询里的T1."address" != T2."address"条件,只保留JOIN关联就行,调整后的SQL如下:
SELECT A."Fname"||' '||A."Lname" AS "Customer_Name", A."EMAIL", T."address", COUNT(*) AS "Countof" FROM "S_CONTACT" A JOIN "t2" T ON A."Fname" = T."Fname" AND A."Lname" = T."Lname" WHERE EXISTS ( SELECT 1 FROM "S_CONTACT" B WHERE A."PHONE" != B."PHONE" AND A."Fname" = B."Fname" AND A."EMAIL" = B."EMAIL" AND A."Lname" = B."Lname" AND A."DOB" IS NULL ) GROUP BY A."Fname", A."Lname", A."EMAIL", T."address" HAVING COUNT(*) > 1;
你可以根据自己的实际需求选择对应的版本哦!
内容的提问来源于stack exchange,提问作者Sumeet Jaiswal
相关产品推荐
相关产品推荐

