SQL查询帮助:获取具有相同名字和与定义列表匹配的姓氏的所有行

时间:2012-03-02 22:15:27

标签: sql oracle duplicates records

表设计:

First_Name Last_name

有几条记录具有相同的名字但姓氏不同。我需要找到所有具有相同名字和已定义姓氏列表的记录。

例如:

First_Name Last_name
John       Pohn
John       Qohn
John       Rohn
Jack       Rohn
Jack       Pohn
Sam        Pohn
Sam        Rohn
Sam        Qohn

姓氏名单:Pohn和Qohn

因此我的查询应该只选择这些记录

John Pohn
John Qohn
Sam  Pohn
Sam Qohn

1 个答案:

答案 0 :(得分:3)

很难说出你想要的东西 - 这意味着对于任何出现不止一次的名字,你想要显示所有匹配记录的名字和姓氏吗?如果是这样,您可以使用分析函数,例如:

select first_name, last_name
from (
    select first_name, last_name,
        count() over (partition by first_name) as cnt
)
where cnt > 1;

内部查询为每一行添加一个虚拟列,显示第一个名称在整个数据集中出现的次数;外部查询然后筛选出只出现一次的任何内容。一般情况下,这比自联接更好,因为你只打了一次表。

如果您只对特定的姓氏感兴趣,可以在任一级别添加一个过滤器(根据DCookie的答案),结果略有不同 - 取决于您是否希望计数中包含所有姓氏,或仅列表中的特定内容。


当然,如果这是家庭作业而你刚刚学习了自我加入,那么这可能是你现在应该采用的方式 - 虽然我不喜欢教一些次优的东西,除非它告诉你为什么会这样。如果是家庭作业,请查看您可以获得多远,然后将您的尝试和任何错误等添加到问题中。