【问题标题】:SQL Find and display possible duplicatesSQL 查找并显示可能的重复项
【发布时间】:2018-08-20 18:30:33
【问题描述】:

我对 SQL 很陌生,这可能是一件容易的事,但我一直在寻找一个问题来回答这个问题,但没有成功。

我有一张桌子,我们称它为“客户”,如下所示:

**Customers**
-Customer_id
-Name
-Address
-City
-State
-Zip
-Phone

问题是它可能有重复的客户,所以我想编写一个查询,将列出所有客户,其中有另一个客户具有相同的电话号码,并显示以下字段:

客户名称、州、电话、重复客户名称、重复 客户状态,重复的客户电话

下面的说法我试过了,还是不行

SELECT Name, State, Phone FROM Customers
GROUP BY Phone
HAVING COUNT (Phone)>1;

我可以看到重复使用的电话号码

SELECT Phone FROM Customers
GROUP BY Phone
HAVING COUNT(Phone)>1

此外,正如建议的那样,我们不能假设它们在 id 字段中具有相同的值,因为这模拟了数据输入策略较差的情况,并且 id 通常是自动分配的。

所以我认为这是我应该走的方向,并且可能使用'AS'关键字来显示'重复客户'字段,但从这里我迷路了,希望你能指出我正确的方式.谢谢。

【问题讨论】:

  • 您使用的 DBMS 是什么?

标签: sql


【解决方案1】:

如果您想选择除分组或聚合的列之外的其他列,那么您可以这样做

SELECT * 
FROM Customers
WHERE Phone in
(
    SELECT Phone 
    FROM Customers
    GROUP BY Phone
    HAVING COUNT(*) > 1
)

【讨论】:

  • 这行得通,如果我将 * 更改为姓名、州、电话,这几乎是我想要的,因为它只显示电话号码多次出现的客户。我可以以我想要的格式显示它们吗?我的意思是,将相同的电话号码分组在 1 列中。谢谢
【解决方案2】:

如果Customer_id 具有相同的值,则可以使用exists

select c.*
from customers c
where exists (select 1 
              from customers c1 
              where c1.Phone = c.Phone and 
                    c1.Customer_id <> c.Customer_id
             );

【讨论】:

  • 遗憾的是,我们不能假设它们在 id 字段中具有相同的值,因为这模拟了数据输入策略较差的情况,并且 id 通常是自动分配的,但感谢您的建议,我将编辑澄清这一点的问题
【解决方案3】:

用 EXISTS 运算符试试这个

SELECT Name, State, Phone FROM Customers c
where EXISTS
(SELECT 1 FROM Customers c1 on c1.phone=c.phone
GROUP BY Phone
HAVING COUNT(Phone)>1)

【讨论】:

  • 它说在ON之前需要一个JOIN子句
【解决方案4】:

我首选的解决方案是 Yogesh Sharma 建议的 exists。但如果这不起作用,那么窗口函数是一个不错的选择:

select c.*
from (select c.*, count(*) over (partition by phone) as cnt
      from customers c
     ) c
where cnt > 1

【讨论】:

    猜你喜欢
    • 2010-11-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-03
    • 2016-09-29
    • 2015-03-03
    相关资源
    最近更新 更多