如何创建具有重复联系人的新表

问题描述:

我正在尝试创建需要在我的用户表中找到重复用户的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

你是什么意思“用户的阵列?”你的意思是存储一个集合数据类型?一个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

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

这个查询不错,但不是我要求的,谢谢 – Ofer 2012-03-28 13:56:25

也许是这样的:

;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

你可以用下面的查询 贴过什么@vulkanino仅供您参考,您可以使用此查询为您的答案如下 -

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

此查询应给你有任何其他ID占用的电子邮件的ID列表,我的理解与您的问题。

请纠正我,如果我有你的问题的理解是错误..