SQL - 使用重复信息选择多个列,使用唯一信息选择一些

时间:2017-08-01 00:19:32

标签: sql select db2

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

  • 相同的First_Name
  • 相同的Last_Name
  • 相同的DOB
  • 相同的client_ID(给出Client_ID" 1011")
  • 不同的Member_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

我甚至没有选择不同的Member_ID,但是这个查询仍会提取不必要的记录。 请帮忙。 以下是示例数据,突出显示的是我希望能够获得的对: My Sample Table

3 个答案:

答案 0 :(得分:1)

只需使用窗口功能:

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;

答案 1 :(得分:0)

作为一般说明,除非绝对必须,否则不要使用相关的子查询。当外部查询的每一行都运行子查询时,性能会受到严重影响。一个简单的连接应该起作用:

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

答案 2 :(得分:0)

如果您的唯一目的是查找具有相同详细信息但差异成员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