加入 SQL 个表格并删除重复项

Joining SQL tables and removing repetitions

我正在尝试获取具有相同 phone 号码的客户的列表,因为有些情况下同一客户被创建了两次或三次,但名称略有不同。

下面的查询几乎具有预期的行为:

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

但我得到了这样的重复:

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

当我只想得到前两行时,足以涵盖所有情况。

在此先感谢您的帮助。

我不确定您是否只需要前两行。 . .因为最后一行似乎不同。

无论如何,您可以将 != 替换为 < 以获得您想要的结果:

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;

如果您只想要给定 phone 号码上的所有客户 - 当有多个客户时 - 那么您不需要 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;

您可以使用子查询(或使用相同登录名的 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