Oracle使用join和多列选择distinct

时间:2016-08-02 14:59:02

标签: oracle join unique distinct

不幸的是,这个数据库中有大量重复的电子邮件地址。我需要做一个查询并只返回唯一的电子邮件,这并不重要。

我看起来像这样的查询,无法确定要添加的内容不会返回重复的电子邮件。谁能想到什么?

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;

2 个答案:

答案 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;