不幸的是,这个数据库中有大量重复的电子邮件地址。我需要做一个查询并只返回唯一的电子邮件,这并不重要。
我看起来像这样的查询,无法确定要添加的内容不会返回重复的电子邮件。谁能想到什么?
select c.cid, c.email, c.uuid, e.code
from c
inner join e on e.cid = c.cid
where regexp_like(c.email, '\.net$', 'i');
- 根据要求添加一些额外信息
上述查询返回以下结果,您可以在其中看到重复的结果。我感兴趣的是每个唯一的电子邮件地址只返回一行。
3478|cust1@cust1.net|ouskns;dhf|1
3488|cust2@cust2.net|jlsudo;uff|0
3598|cust3@cust3.net|dl;udjffff|1
3798|cust1@cust1.net|osuosdujff|1
3888|cust1@cust1.net|odsos7jfff|1
- 解决方案,谢谢Mathguy
select cid, email, uuid, code
from
(select c.cid, c.email, c.uuid, e.code, row_number() over (partition by
c.email order by null) as rn
from c
inner join e on e.cid = c.cid
where regexp_like(c.email, '\.net$', 'i')
)
where rn = 1;
答案 0 :(得分:2)
如果它按原样工作且唯一的问题是重复项,则可以在c.email
子句中将MAX(c.email) as email
更改为select
,并将group by子句添加到另一个组中select
中包含的列。
编辑:(实际上我应该删除原来的答案,因为OP澄清了他的问题与他原来的问题完全不同 - 但这也会删除评论......所以改为编辑
如果您的查询产生了所需的结果,但现在您必须为每个电子邮件地址选择一个随机行,您可以尝试这样做:
select cid, email, uuid, code
from
( -- .... copy your select query here
-- ADD one column to the select line like so:
-- select c.cid, c.uuid, c.email, e.code,
-- row_number() over (partition by c.email order by null) as rn
-- ....
)
where rn = 1;
答案 1 :(得分:0)
使用DISTINCT
:
select DISTINCT c.email
from c
inner join e on e.cid = c.cid
where regexp_like(c.email, '\.net$', 'i');
或使用GROUP BY
(并获得cnt
列中的重复次数)
select c.email, count(*) as cnt
from c
inner join e on e.cid = c.cid
where regexp_like(c.email, '\.net$', 'i')
GROUP BY c.email;