SQL-选择具有重复信息的多个列,以及一些具有唯一信息的列

SQL-选择具有重复信息的多个列,以及一些具有唯一信息的列,sql,select,db2,Sql,Select,Db2,我需要生成一个查询,该查询将使用以下内容提取所有记录: 同名 同姓 相同的出生日期 相同的客户ID(客户ID为“1011”) 不同的成员ID 注意:我有一个拥有数百万条记录的大型数据库,只要我提供了多个子查询,就需要几个小时才能提供第一个数据样本。(也许我的子查询不正确) 我已经尝试过一步一步地构建这个查询,但它仍然无法按照我需要的方式进行过滤 Select ta.Member_ID, ta.First_Name, ta.LAST_NAME, ta.date_of_birth, ta.cli

我需要生成一个查询,该查询将使用以下内容提取所有记录:

  • 同名
  • 同姓
  • 相同的出生日期
  • 相同的客户ID(客户ID为“1011”)
  • 不同的成员ID
注意:我有一个拥有数百万条记录的大型数据库,只要我提供了多个子查询,就需要几个小时才能提供第一个数据样本。(也许我的子查询不正确) 我已经尝试过一步一步地构建这个查询,但它仍然无法按照我需要的方式进行过滤

Select
ta.Member_ID,
ta.First_Name,
ta.LAST_NAME,
ta.date_of_birth,
ta.client_id,

From TestTable ta
WHERE client_id = '1011'
AND
        ((SELECT COUNT(*)
                FROM TestTable ta2
                     WHERE ta.date_of_birth=ta2.date_of_birth
                     AND ta.FIRST_NAME=ta2.FIRST_NAME
                     AND ta.LAST_NAME=ta2.LAST_NAME)>1
我甚至没有选择不同的成员ID,但这个查询仍然会提取不需要遵循这些参数的记录。 请帮忙。 以下是示例数据,突出显示的是我希望能够获得的数据对:

一般来说,不要使用相关子查询,除非您必须这样做。当为外部查询的每一行运行子查询时,性能会受到严重影响。一个简单的连接应该可以工作:

Select
ta.Member_ID,
ta.First_Name,
ta.LAST_NAME,
ta.date_of_birth,
ta.client_id

From TestTable ta JOIN TestTable ta2
WHERE ta.client_id = '1011' AND ta.Member_ID <> ta2.Member_ID
ON ta.date_of_birth=ta2.date_of_birth
                     AND ta.FIRST_NAME=ta2.FIRST_NAME
                     AND ta.LAST_NAME=ta2.LAST_NAME
                     AND ta.client_id=ta2.client_id
选择
电讯局长,
ta.名字,
ta.姓,
ta.出生日期,
客户识别码
从TestTable ta连接TestTable ta2
其中ta.client\u id='1011'和ta.Member\u id ta2.Member\u id
ta.出生日期=ta2.出生日期
和ta.FIRST_NAME=ta2.FIRST_NAME
和ta.LAST_NAME=ta2.LAST_NAME
和ta.client\u id=ta2.client\u id

只需使用窗口功能:

SELECT ta.Member_ID, ta.First_Name, ta.LAST_NAME, ta.date_of_birth,
       ta.client_id
FROM (SELECT ta.*,
             COUNT(*) OVER (PARTITION BY FIRST_NAME, LAST_NAME, date_of_birth) as cnt
      FROM TestTable ta
     ) ta
WHERE client_id = '1011' AND cnt > 1;

如果您的唯一目的是查找具有相同详细信息但不同成员ID的记录,请使用基本分组依据筛选数据。这并不像连接两个表那样昂贵

Select
ta.First_Name,
ta.LAST_NAME,
ta.date_of_birth,
ta.client_id
From TestTable ta
group by 
ta.First_Name,
ta.LAST_NAME,
ta.date_of_birth,
ta.client_id
having count(distinct Member_ID) > 1

它确实返回了所有具有相同FName、LName和DOB的记录(只花了几个小时就提取了100多万条记录)。现在我如何向它添加一个条件?我需要相同的FName、LName和DOB,但不同的“成员ID”?非常感谢,非常好的帮助我不知道“不同的会员Id”是什么意思。但是,您可以提取外部查询中的所有列。此查询不会仅返回具有相同FName、LName和DOB的记录。也并没有真正区分MemberID,结果非常类似于我写的,但更快-工作速度快。谢谢。它生成了一个错误:GROUP BY子句中未指定以SELECT子句、HAVING子句或ORDER BY子句中指定的“Member_ID”开头的表达式,或者该表达式位于SELECT子句、HAVING子句或ORDER BY子句中,并且具有列函数,并且未指定GROUP BY子句。您忘记了表的ta别名,我已经改正了;)