首页 > 解决方案 > 按名字和姓氏查找重复记录

问题描述

我有一张桌子叫beneficials. 关于它的一些事实:

表中的一些样本数据

| id | firstname | lastname | organization_id |
|----|-----------|----------|-----------------|
| 1  | jan       | kowalski | 1               |
| 2  | jan       | kovalski | 3               |
| 3  | john      | doe      | 1               |
| 4  | jan       | kowalski | 2               |

我想beneficial通过名字和姓氏查找来自组织的 a 是否也存在于其他组织中,如果是,我想获取组织或组织 ID。

在上面的示例数据中,我想要的是组织 id 1,查询应该返回2,因为jan kowalski对组织也有好处,2但不是3因为即使它们匹配名字,它们也不匹配姓氏

我想出了以下查询:

with org_beneficials as (
  select firstname, lastname from beneficials where organization_id = ? and deleted_at is null
)
select organization_id from beneficials 
    where firstname in (select firstname from org_beneficials)
    and lastname in (select lastname from org_beneficials)
    and deleted_at is null
    and organization_id <> ?;

有点工作,但如果来自不同组织的受益者共享相同的名字或姓氏,则会返回一些误报。我需要匹配名字和姓氏,但我不知道如何。

我曾考虑加入表本身,但我不确定这是否可行,因为组织有很多好处。添加一个类似的列fullname不是我想在这里做的事情

标签: sqlpostgresql

解决方案


您可以group by名字和姓氏,然后过滤重复项

SELECT firstname, lastname 
FROM beneficials
GROUP BY  firstname, lastname 
HAVING COUNT(*) > 1;

编辑后,您似乎想要选择给定组织的人员的记录,这些记录也出现在不同的组织中

SELECT *
FROM beneficials a
WHERE a.organization_id != 1
AND EXISTS (
    SELECT 1 
    FROM beneficials b
    WHERE a.firstname = b.firstname
     AND a.lastname = b.lastname
     AND b.organization_id = 1
    );

推荐阅读