如何创建具有重复联系人的新表
我正在尝试创建需要在我的用户表中找到重复用户的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
在先进的感谢。
你是什么意思“用户的阵列?”你的意思是存储一个集合数据类型?一个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
csv列表对我来说很好,结果应该是contact_id,使用同一电子邮件的id列表 – Ofer 2012-03-28 14:20:28
根据您的评论更新我的答案。 – 2012-03-28 14:49:47
SELECT
email,
COUNT(email) AS occurrences
FROM
users
GROUP BY
email
HAVING (COUNT(email) > 1);
这个查询不错,但不是我要求的,谢谢 – Ofer 2012-03-28 13:56:25
你可以用下面的查询 贴过什么@vulkanino仅供您参考,您可以使用此查询为您的答案如下 -
select ID --*
from users
where email in
(
SELECT email
FROM users
GROUP BY email
HAVING (COUNT(email) > 1)
)
此查询应给你有任何其他ID占用的电子邮件的ID列表,我的理解与您的问题。
请纠正我,如果我有你的问题的理解是错误..
你在使用。 mssql,mysql,oracle等? – Arion 2012-03-28 13:51:23
oracle sql developer – Ofer 2012-03-28 13:52:26