SQL查找并显示可能的重复项

时间:2018-08-20 10:01:56

标签: sql

我对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”关键字来显示“重复的客户”字段,但是从这里我迷路了,希望您能以正确的方式指出我。谢谢。

4 个答案:

答案 0 :(得分:2)

如果您要选择分组或汇总以外的其他列,则可以这样做

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
             );

答案 2 :(得分:0)

尝试使用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)

答案 3 :(得分:0)

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

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