2017-08-01 33 views
1

我需要制作一个查询,将拉动所有记录多列:SQL - 选择重复的信息和一些独特的

  • 同样将First_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

回答

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 
+0

此查询不会仅返回具有相同FName,LName和DOB的记录。也没有通过MemberID真正区分,Result与我写的非常类似,但更快 - 工作得很快。谢谢。 – bigV

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; 
+0

它确实返回了具有相同FName,LName和DOB的所有记录(花了几个小时才拉出了一百多万条记录)。现在我该如何添加一个更多的条件呢?我需要相同的FName,LName和DOB,但**不同**“Member_ID”?非常感谢,很有帮助 – bigV

+0

我不知道“不同的Member_Id”是什么意思。不过,您可以拉外部查询中的所有列。 –

0

如果你唯一的目的是要找到具有相同内容的记录,但diff的会员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 
+0

IT生成一个错误:在SELECT子句,HAVING子句或ORDER BY子句中指定的以“Member_ID”开头的表达式不在GROUP BY子句中指定,或者它在SELECT子句,HAVING子句或ORDER BY子句中列函数和没有指定GROUP BY子句。 – bigV

+0

你忘了ta别名的表,我纠正;) – Esperento57

+0

谢谢你先生:) – uSeruSher