【问题标题】:fetching duplicate tuples in Oracle using SQL使用 SQL 在 Oracle 中获取重复的元组
【发布时间】:2026-02-06 03:40:01
【问题描述】:

这是两个表结构

我有两个表,我试图根据where a.fname=b.fname and a.phone_no<>b.phone_no 等条件获取一些重复记录

但我还需要包括表 2 中的其他列“地址”,并为重复检查地址引入相同的条件。

SELECT 
 "Fname"||' '||"Lname" AS "Customer_Name",
  COUNT(*) AS "Countof" 
FROM "S_CONTACT" A 
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 "DOB" IS NULL
) 
GROUP BY "Fname","Lname","EMAIL" 
HAVING count(*) >1; 

上面的 sql 给了我一个重复姓名和电子邮件的客户列表。
但是我不知道如何在这个sql中引入来自不同表t2的列地址

【问题讨论】:

  • 您声称有两个表,但您的查询只引用了一个。知道你想要什么结果会很有帮助。
  • 嗨,@GordonLinoff 上面的查询仅针对一个表进行,其中它给了我重复条目的计数,但我还想在我的 sql“地址”中引入来自表 2 的另一列。表1和表2与ROW_ID和PR_PER_ADDR_ID相关
  • @SumeetJaiswal:你能举一个你想要的输出的例子吗?
  • @GordonLinoff 查询不起作用:SELECT "Fname"||' '||"Lname" AS "Customer_Name","ADDRESS",COUNT() AS "Countof" FROM "S_CONTACT" A,"S_ADDR_PER" C WHERE EXISTS (SELECT 1 FROM "S_CONTACT" B, "S_ADDR_PER" D其中 A."PHONE" != B."PHONE" AND A."Fname" = B."Fname" AND A."EMAIL"=B."EMAIL" AND A."Lname"=B."Lname" AND "DOB" 为 NULL 并且 C."ADDRESS"=D."ADDRESS" AND "S_CONTACT"."PR_PER_ADDR_ID"="S_ADDR_PER"."ROW_ID") GROUP BY "Fname","Lname","EMAIL","ADDRESS " 计数() >1; sql条件:fname -same lname-same email -same phone -different ,address -same
  • @GordonLinoff 所需输出:Fname Lname EMAIL ADDRESS Countof Ashley Doug ashley.doug@abc.com 13,louisiana 2 Chris woakes chris.woakes@abc.com 14,louisiana 2

标签: sql database oracle join plsqldeveloper


【解决方案1】:

如果您试图在一个表中查找重复项:

select c.fname, c.lname, c.email
from contacts c
group by c.fname, c.lname, c.email
having min(c.phone) <> max(c.phone);

如果您想将null 计为不同的值,请使用:

having min(c.phone) <> max(c.phone) or count(c.phone) <> count(*)

你可以在第二张桌子上做同样的事情:

select c.fname, c.lname, c.email
from second_table c
group by c.fname, c.lname, c.email
having min(c.address) <> max(c.address) or count(c.address) <> count(*)

如果您需要相同结果集中的结果,则使用unionunion all 或一些类似的机制。

【讨论】:

  • 嗨,戈登,您可以看到有两个表,我想获取所有重复记录及其计数。我已经成功地为同一个表中的列做到了这一点,但我的要求是从图像中给出的表 2 中选择另一列“ADDRESS”并比较它以检查它是否与特定 ROW_ID 重复,该 ROW_ID 与 PR_PER_ADDR_ID 有关系表 1.当我合并两者时,我在计算重复地址时遇到问题。
  • @Gordon Linoff:你为什么使用having min(col)&lt;&gt;max(col) 而不是having count(*)&gt;1。这不适用于 NULL 值,不是吗?
  • @wolφi 。 . .因为count(*) 无法确定值是否不同。但我看到值可以是NULL,所以我在问题中添加了适当的逻辑。
  • 但是你group by,所以having 测试你组中的号码,所以count 工作正常。
  • @SumeetJaiswal 。 . .这样的解释属于 question 而不是 cmets。