2015-02-10 91 views
0

我想要获取具有相同电话号码的客户列表,因为有相同客户的实例创建了两次或三次,名称略有不同。加入SQL表并删除重复

查询下面已经几乎是预期的行为:

SELECT C1.CUSTOMER_NAME, C2.CUSTOMER_NAME, C1.PHONE_NUMBER 
FROM CUSTOMER C1 
JOIN CUSTOMER C2 
ON C1.PHONE_NUMBER = C2.PHONE_NUMBER 
WHERE C1.CUSTOMER_NAME != C2.CUSTOMER_NAME 
AND C1.PHONE_NUMBER != '' 
ORDER BY C1.CUSTOMER_NAME 

,但我得到repetions这样的:

Customer A - Customer B 
Customer A - Customer C 
Customer B - Customer A 
Customer B - Customer C 
Customer C - Customer A 
Customer C - Customer B 

当所有我想要得到的是前两行,这是足以覆盖所有的情况。

在此先感谢您的帮助。

+0

明确你想要它的位混淆写希望的结果,并提供你的结果集。 – 2015-02-10 16:43:45

回答

2

我不确定你只想要前两行。 。 。因为最后一行似乎不同。

在任何情况下,你可以用<代替!=得到你想要的东西:

SELECT C1.CUSTOMER_NAME, C2.CUSTOMER_NAME, C1.PHONE_NUMBER 
FROM CUSTOMER C1 JOIN 
    CUSTOMER C2 
    ON C1.PHONE_NUMBER = C2.PHONE_NUMBER AND 
     C1.CUSTOMER_NAME < C2.CUSTOMER_NAME 
WHERE C1.PHONE_NUMBER <> '' 
ORDER BY C1.CUSTOMER_NAME; 

如果你只是想所有在指定电话号码的客户 - 当有多个客户 - - 那么你并不需要一个join

select c.phone_number, c.name 
from (select c.*, count(*) over (partition by phone_number) as cnt 
     from customer c 
    ) c 
where cnt > 1 
order by c.phone_number, c.name; 
+0

你是对的,最后一种情况是不同的,但当他们更新A,B和C的电话号码时,最后一种情况也将被修复。我更喜欢最好的解决方案,只是因为它更接近我期待的内容,但第二个解决方案也能正常工作。谢谢。 – fpele 2015-02-10 16:52:17

2

你可以使用子查询(或具有相同的登录JOIN),以获得重复的号码,然后再对所有的客户与数报告:

SELECT CUSTOMER_NAME, PHONE_NUMBER 
FROM CUSTOMER 
WHERE PHONE_NUMBER IN (SELECT PHONE_NUMBER 
         FROM CUSTOMER 
         WHERE COUNT(PHONE_NUMBER) > 1 AND PHONE_NUMBER != '') 
ORDER BY PHONE_NUMBER