2017-08-01 54 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