You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.29 06:59:27