sql - 按名字和姓氏查找重复记录
问题描述
我有一张桌子叫beneficials
. 关于它的一些事实:
- 利益属于
one
组织 - 一个组织
many
有好处 - 受益人有名字和姓氏,没有其他身份证明形式。
表中的一些样本数据
| 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
不是我想在这里做的事情
解决方案
您可以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
);
推荐阅读
- django - 在 POST 申请中发送列表 - Django Rest Framework
- android - Jetpack Security EncryptedFile.Builder 不加密文件
- windows - GCPW Azure 云 Windows
- hyperledger-fabric - 如何使用 Hyperledger Caliper 集成和测试使用 Hyperledger Fabric 版本 2.3.1 创建的项目?
- javascript - 通过 cypress 对 API 调用使用 async await 承诺
- reactjs - Google O Auth 在本地服务器上工作,但在 nelify 上部署后没有(每次都调用 onFailure)
- python - 将第二列中的值附加到第一列 Python 的末尾
- android - 自定义 Xamarin Forms 应用程序中选项卡项上的焦点状态外观,Android 实现
- django - 选择过滤器一旦添加到数据库中
- numpy - 如何沿单个 pytorch 张量的维度连接?