【问题标题】:Oracle SQL Query to identify unique email addresses associated with multiple account IDs用于识别与多个帐户 ID 关联的唯一电子邮件地址的 Oracle SQL 查询
【发布时间】:2017-04-26 15:12:34
【问题描述】:

仍在学习 SQL,当电子邮件与多个帐户相关联时,我无法创建一个返回电子邮件地址和帐户 ID 列表的查询。

服务器是 Oracle SQL,我正在处理一个表“EMAIL”和两个字段“UID 和“EMAIL_ADDRESS”。

我只想在同一电子邮件列在多个帐户 ID 上时包含电子邮件和帐号。帐户 ID 可以有多个电子邮件,并且同一电子邮件可以在同一个帐户 ID 上多次列出。那没问题。所以,我想排除那些结果,这是我遇到麻烦的地方。

我有一个查询,当电子邮件与多个帐户相关联时,该查询当前返回与其相关联的帐户 ID 的数量。但是,我无法将其转换为可以查看帐号 ID 号的列表。

我当前使用的查询是

SELECT COUNT(EMAIL.UID), EMAIL.EMAIL_ADDRESS
FROM EMAIL
GROUP BY EMAIL.EMAIL_ADDRESS 
HAVING COUNT(DISTINCT EMAIL.UID) > 1

这会返回一个类似的列表:

Count of UID      EMAIL_ADDRESS
2                 asmith@...
3                 bjones@...
5                 cbaker@...

我需要的是:

UID               EMAIL_ADDRESS
67890             asmith@...
75236             asmith@...
15689             bjones@...
56748             bjones@...
89523             bjones@...
98542             cbaker@...
00245             cbaker@...
etc, etc          etc, etc

我还需要按电子邮件地址排序,以便将相同的电子邮件一起列出。

感谢任何帮助!

谢谢, 迈克

【问题讨论】:

  • 将您当前的查询放在子查询中。使用该子查询连接表。
  • 你没那么远。获得电子邮件列表后,您只需获取电子邮件地址为IN ( yourSelect) 的所有行。或者,您可以将查询用作子查询并加入表,例如 select ... from yourTable inner join (yourSelect) on (...)

标签: sql oracle


【解决方案1】:

在这里,我使用 count(*) 分析函数来提供内部查询或视图中具有相同地址的记录的计数。然后,我用一个查询包装了它,该查询仅过滤计数大于 1 的行。

select email_id, email_address from 
        (with email (id, email_address) as
         (select 67890 as id, 'asmith@...' as email_address from dual union all
          select 75236, 'asmith@...' from dual union all
          select 15689, 'bjones@...' from dual union all
          select 56748, 'bjones@...' from dual union all
          select 89523, 'bjones@...' from dual union all
          select 98542, 'cbaker@...' from dual union all
          select 00245, 'cbaker@...' from dual union all
          select 54321, 'unique1@...' from dual union all
          select 65432, 'unique2@...' from dual)
    select to_char(id,'00009') as email_id, email_address,
           count(*) over (partition by email_address) as c
 from email) email_data
 where email_data.c > 1
 order by email_data.email_address;

【讨论】:

    【解决方案2】:

    试试这个:

    内部查询给出了那些EMAIL_ADDRESS,他们至少有两个或更多不同的UI_D。然后简单地将这些 EMAIL_ADDRESS 与整个表连接起来。

    SELECT EMAIL.* FROM EMAIL INNER JOIN (
          select  EMAIL_ADDRESS from EMAIL
          group by  EMAIL_ADDRESS
          having min(UI_D) <> max(UI_D)
    ) TT
    on EMAIL.EMAIL_ADDRESS = TT.EMAIL_ADDRESS
    order by EMAIL.EMAIL_ADDRESS, EMAIL.UI_D
    

    【讨论】:

      【解决方案3】:

      这样的东西有用吗?

      选择不同的 uid,电子邮件 来自电子邮件 通过电子邮件订购;

      【讨论】:

        【解决方案4】:

        使用解析函数很简单:

        select ID, EMAIL_ADDRESS from 
          (select ID, EMAIL_ADDRESS, count(*) over (partition by EMAIL_ADDRESS) count from EMAIL) 
        where count > 1 order by EMAIL_ADDRESS;
        

        如果您对以下数据运行此查询:

        create table EMAIL (ID number primary key, EMAIL_ADDRESS varchar2(255));
        insert into EMAIL values (1, 'test@test.de');
        insert into EMAIL values (2, 'test@test.de');
        insert into EMAIL values (3, 'test2@test.de');
        

        结果是:

        1   test@test.de
        2   test@test.de
        

        【讨论】:

          猜你喜欢
          • 2010-10-02
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-04-08
          • 1970-01-01
          • 2015-09-10
          • 1970-01-01
          相关资源
          最近更新 更多