【问题标题】:SQL Query Help: Fetch all rows with same first name and with a last names matching a defined listSQL 查询帮助:获取具有相同名字且姓氏与定义列表匹配的所有行
【发布时间】:2012-03-21 10:02:05
【问题描述】:

餐桌设计:

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

【问题讨论】:

  • @Justin 你的编辑完全改变了这个问题......我不认为这就是好奇的意思,我认为他想找到所有姓氏 *ohn 的“约翰”
  • @alfasin - 你是什么意思?贾斯汀只是格式化了已经存在的内容,没有其他任何更改?
  • @AlexPoole 我的理解是,他只想要姓氏格式为“*ohn”的“John”。他的问题最初的格式看起来不像是在寻找“Sam”和“Jack”。但最好让好奇解释一下——也许是我不明白他的意思。

标签: sql oracle duplicates records


【解决方案1】:

在这里很难说出您想要什么 - 是否意味着对于多次出现的任何名字,您希望同时显示所有匹配记录的名字和姓氏?如果是这样,您可以使用分析函数,例如:

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

内部查询为每一行添加一个虚拟列,显示名字在整个数据集中出现的次数;然后外部查询过滤掉任何只出现一次的查询。一般来说,这比自联接要好,因为您只打表一次。

如果您也只对特定姓氏感兴趣,您可以在任一级别为这些姓氏添加一个过滤器(根据 DCookie 的回答),结果略有不同 - 取决于您是希望所有姓氏都包含在计数中,还是只包含列表中的特定对象。


当然,如果这是家庭作业并且您刚刚学习了自联接,那么您现在应该采用这种方式 - 尽管我不喜欢教一些次优的东西,除非它是为了展示你为什么会这样。如果是家庭作业,看看你能走多远,然后将你的尝试和任何错误等添加到问题中。

【讨论】:

  • 比我的更好的答案 ;-)
猜你喜欢
  • 2014-02-19
  • 1970-01-01
  • 1970-01-01
  • 2019-07-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-04-02
相关资源
最近更新 更多