2012-03-28 70 views
1

我正在嘗試創建需要在我的用戶表中找到重複用戶的sql過程或函數(如果用戶具有相同的電子郵件,則需要重複)。我想給用戶保存在一個新的表是這樣的:如何創建具有重複聯繫人的新表

id | user_id | duplicate_users 

的duplicate_users將包含用戶ID的數組,有一個像USER_ID 相同的電子郵件這是我的主查詢,但它是非常糟糕的,因爲我得到了許多結果。

SELECT a.id user_id, 
     a.email, 
     b.id, 
     dup_user_id 
FROM users a, 
     users b 
WHERE a.email = b.email 
    AND a.id != b.id 

在先進的感謝。

+0

你在使用。 mssql,mysql,oracle等? – Arion 2012-03-28 13:51:23

+0

oracle sql developer – Ofer 2012-03-28 13:52:26

回答

3

你是什麼意思「用戶的陣列?」你的意思是存儲一個集合數據類型?一個CSV列表?術語「數組」並不真正適合Oracle領域。

此外,根據您要求的關鍵是電子郵件的性質,而不是其中一個ID,否則您會獲得每個組合。

例如,用戶a和b每個都有電子郵件「[email protected]」。您的查詢將有

一個,[email protected],B B,[email protected],一個

我想你想要的是

[email protected],(一,b)

現在,爲了使該領域ID的CSV列表,你可以使用:

​​

如果你想的ID存儲在Oracle集合中,我會引導你朝這個方向了。

編輯:根據您的評論。

OK,如果你想要的全部結果,然後ammend到

SELECT a.id as id 
     a.email as email,   
     listagg(b.id,',') WITHIN GROUP (ORDER BY ID) as list_of_ids   
FROM users a, users b 
where a.email = b.email 
and  a.id != b.id 
GROUP BY a.id, a.email 

因此,如果用戶A,B和C都共享電子郵件[email protected]您將獲得:

一個, [email protected],「b,c」

b,bob @ inter。網, 「A,C」

C,[email protected], 「A,B」

如果你想從查詢刪除的電子郵件,然後:順便說一句

SELECT a.id as id 
     listagg(b.id,',') WITHIN GROUP (ORDER BY ID) as list_of_ids   
FROM users a, users b 
where a.email = b.email 
and  a.id != b.id 
GROUP BY a.id 

,如果您使用的是不支持listagg字符串聚合函數的Oracle舊版本,那麼您將能夠在此處找到備用解決方案:http://www.oracle-base.com/articles/misc/StringAggregationTechniques.php

我建議使用適用於Oracle 11.1或10的wm_concat()等效,或者Oracle 9的其他人之一。

因此,對Oracle 11.1或10,使用:

SELECT a.id as id 
     a.email as email,   
     wm_concat(b.id) as list_of_ids   
FROM users a, users b 
where a.email = b.email 
and  a.id != b.id 
GROUP BY a.id, a.email 
+0

csv列表對我來說很好,結果應該是contact_id,使用同一電子郵件的id列表 – Ofer 2012-03-28 14:20:28

+0

根據您的評論更新我的答案。 – 2012-03-28 14:49:47

0
SELECT 
email, 
COUNT(email) AS occurrences 
FROM 
users 
GROUP BY 
email 
HAVING (COUNT(email) > 1); 
+0

這個查詢不錯,但不是我要求的,謝謝 – Ofer 2012-03-28 13:56:25

0

也許是這樣的:

;WITH CTE 
AS 
(
    SELECT 
     ROW_NUMBER() OVER(PARTITION BY users.email ORDER BY users.email) RowNbr, 
     users.id, 
     users.email 
    FROM 
     users 
) 
SELECT 
    * 
FROM 
    CTE 
WHERE 
    CTE.RowNbr>1 

這將讓你的副本

+0

CTE是什麼意思? – Ofer 2012-03-28 13:59:46

+0

我運行這個查詢,這不是我所需要的,無論如何感謝 – Ofer 2012-03-28 14:11:22

0

你可以用下面的查詢 貼過什麼@vulkanino僅供您參考,您可以使用此查詢爲您的答案如下 -

select ID --* 
    from users 
where email in 
     (
     SELECT email 
      FROM users 
      GROUP BY email 
     HAVING (COUNT(email) > 1) 
    ) 

此查詢應給你有任何其他ID佔用的電子郵件的ID列表,我的理解與您的問題。

請糾正我,如果我有你的問題的理解是錯誤..

相關問題