1

我在 SQL Server 中有一个包含以下列的表:

MEMBERID, MEMBEREMAIL, FATHEREMAIL, MOTHEREMAIL, MEMBERNAME

MEMBERID是PK。这三个电子邮件列不是唯一的,因此同一电子邮件可能会在同一行和多行中出现多次。

我正在尝试提取一个唯一的电子邮件列表,并且对于每封电子邮件还获得一个memberidmembername(从哪条记录中获取无关紧要)。

例如,如果我有三行:

1   x@x.com   y@y.com   y@y.com   Mark
2   z@z.com   y@y.com   x@x.com   John
3   x@x.com   y@y.com   z@z.com   Susan

我想获取三封电子邮件 ( x@x.com, y@y.com, z@z.com) 以及MEMBERID它们出现的每一封电子邮件。它不是哪个MEMBERID(例如,x@X.com我不在乎我是否得到值 1 和 Mark 或 2 和 John 或 3 和 Susan,只要x@x.com在结果中只出现一次。

如果我在尝试返回电子邮件和 memberid 和 membername 时使用 DISTINCT,我当然会得到所有行。

4

2 回答 2

3

您可以使用子查询来规范所有电子邮件。然后您可以使用row_number过滤掉memberid, membername每封电子邮件:

select  *
from    (
        select  row_number() over (partition by email order by memberid) as rn
        ,       *
        from    (
                select  MEMBERID
                ,       MEMBERNAME
                ,       MEMBEREMAIL as email
                from    YourTable
                union all
                select  MEMBERID
                ,       MEMBERNAME
                ,       FATHEREMAIL
                from    YourTable
                union all
                select  MEMBERID
                ,       MEMBERNAME
                ,       MOTHEREMAIL
                from    YourTable
                ) as emails
        ) num_emails
where   rn = 1

UNPIVOT您还可以使用该子句规范化电子邮件,如下所示:

select  *
from    (
        select  row_number() over (partition by email order by memberid) as rn
        ,       *
        from    (
                select  MEMBERID
                ,       MEMBERNAME
                ,       email
                from    YourTable
                unpivot (
                                email
                        for     emailOwner
                        in      (
                                MEMBEREMAIL,
                                FATHEREMAIL,
                                MOTHEREMAIL
                                )
                        ) as u
                ) as emails
        ) num_emails
where   rn = 1

在SQL Fiddle尝试两个版本:

于 2012-07-03T09:28:45.237 回答
0

此代码将为您提供正确的不同电子邮件组:然后您可以从查询成员中创建一个光标,然后使用此概念获取每个成员的邮件的逗号分隔列表我将为此创建一个输出表,如果您这样做会更容易需要它以供将来使用,并将为此创建一个存储过程来创建自定义表

select mem.*, mails.MEMBEREMAIL
from (
    select MEMBERID,max(MEMBERNAME) as MEMBERNAME
    from table
    group by MEMBERID
)  as mem 
inner join 
(
    select distinct MEMBERID, MEMBEREMAIL
    from (
        select MEMBERID, MEMBEREMAIL
        from table
        union
        select MEMBERID, FATHEREMAIL
        from table
        union
        select MEMBERID, MOTHEREMAIL
        from table
    ) as mail
) as mails on mem.MEMBERID = mails.MEMBERID
于 2012-07-03T09:55:55.567 回答