我需要生成一个查询,它将使用以下内容提取所有记录:
注意:我拥有数百万条记录的庞大数据库,只要我提供多个子查询,即使提供第一个数据样本也需要数小时。 (也许我的子查询不正确) 我已经尝试逐步构建此查询,但仍然无法过滤我需要的方式。
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
答案 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